Changeset 2899
- Timestamp:
- 01/22/10 17:14:29 (15 years ago)
- Location:
- issm/trunk/src
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/Bamgx/Bamgx.cpp
r2877 r2899 52 52 double omega=1.8; 53 53 int NbSmooth=3; 54 int ChoiseHessien = 0; 55 double power=1; 56 int Rescaling=1; 57 54 58 Triangles* Thr=NULL; 55 59 Triangles* Thb=NULL; … … 79 83 if (verbosity>1) printf(" Processing geometry...\n"); 80 84 Geometry Gh(bamggeom,bamgopts); 85 if (verbosity>10){ 86 Gh.Echo(); 87 } 88 89 //get hmin and hmax from geometry to generate the metric 81 90 hmin = Max(hmin,Gh.MinimalHmin()); 82 91 hmax = Min(hmax,Gh.MaximalHmax()); … … 118 127 hmax = Min(hmax,BTh.MaximalHmax()); 119 128 120 // ?????TEST129 //Make Quadtree from background mesh 121 130 BTh.MakeQuadTree(); 122 131 123 132 //build metric if not given in input 124 if (verbosity>1) printf(" Processing Metric...\n");125 133 if (bamgopts->metric){ 134 if (verbosity>1) printf(" Processing Metric...\n"); 126 135 BTh.ReadMetric(bamgopts,hmin,hmax,coef); 136 } 137 else if (bamgopts->field){ 138 if (verbosity>1) printf(" Generating Metric from solution field...\n"); 139 BTh.IntersectConsMetric(bamgopts->field,1,0,hmin,hmax,sqrt(err)*coef,1e30,AbsError?0.0:cutoff,nbjacoby,Rescaling,power,ChoiseHessien); 127 140 } 128 141 else { // init with hmax 129 142 Metric Mhmax(hmax); 130 for (Int4 iv=0;iv<BTh.nbv;iv++) 131 BTh[iv].m = Mhmax; 143 for (Int4 iv=0;iv<BTh.nbv;iv++) BTh[iv].m = Mhmax; 132 144 } 133 145 … … 138 150 139 151 //Build new mesh Thr 152 if (verbosity>1) printf(" Generating Mesh...\n"); 140 153 Thr=&BTh,Thb=0; 141 154 Triangles & Th( *(0 ? new Triangles(*Thr,&Thr->Gh,Thb,maxnbv) : new Triangles(maxnbv,BTh,KeepBackVertices))); … … 163 176 if (verbosity>1) printf(" Write Geometry...\n"); 164 177 Th.Gh.WriteGeometry(bamggeom,bamgopts); 178 if (verbosity>1) printf(" Write Metric...\n"); 179 BTh.WriteMetric(bamgopts); 165 180 166 181 /*clean up*/ -
issm/trunk/src/c/Bamgx/Mesh2.h
r2877 r2899 845 845 Real8 MaximalAngleOfCorner; 846 846 847 // end of data 848 847 void Echo(); 849 848 850 849 I2 toI2(const R2 & P) const { -
issm/trunk/src/c/Bamgx/Metric.h
r2862 r2899 73 73 inline void Box(Real4 &hx,Real4 &hy) const ; 74 74 MetricAnIso(const MatVVP2x2); 75 void Echo(); 75 76 }; 76 77 … … 82 83 D2 v; 83 84 85 void Echo(); 84 86 MatVVP2x2(double r1,double r2,const D2 vp1): lambda1(r1),lambda2(r2),v(vp1){} 85 87 … … 103 105 void BoundAniso(const Real8 c){ BoundAniso2(1/(c*c));} 104 106 void operator *=(double coef){ lambda1*=coef;lambda2*=coef;} 105 107 }; 106 108 107 109 inline void MatVVP2x2::BoundAniso2(const Real8 coef){ -
issm/trunk/src/c/Bamgx/objects/Geometry.cpp
r2885 r2899 580 580 } 581 581 } 582 583 // bulle sort on the angle of edge 582 // in our case, for 4 points and 4 edges (in parenthesis from now on): 583 // hv = 7 2 4 6 584 // ev = -1 -1 1 -1 3 -1 5 0 585 586 //compute angle of edges 584 587 for (i=0;i<nbv;i++) { 588 585 589 int exch=1, ord=0; 586 590 while (exch){ 587 exch =0; 588 Int4* p=hv+i; 589 Int4* po=p; 590 Int4 n=*p; 591 Int4 *p=hv+i; // pointer to hv[vertex i] (p=hv) 592 Int4 *po=p; // copy of pointer p (po=p) 593 Int4 n=*p; // value hv[vertex i] (n=7) 591 594 register float angleold=-1000 ; // angle = - infinity 592 ord =0;593 while (n >=0){ 595 ord=0; exch=0; 596 while (n >=0){// loop as long as ... 594 597 ord++; 595 register Int4 i1=n/2; 596 register Int4 j1=n%2; 597 register Int4 *pn=ev+n; 598 register Int4 i1=n/2; // i1 = floor (n/2) (i1 = 7/2 = 3) 599 register Int4 j1=n%2; // j1 = 1 if n is odd (j1 = 1) 600 register Int4* pn=ev+n; // pointer to ev[n] (pn = &ev[7]) 601 //compute angle from eangle: 602 // if n odd: angle = eangle - Pi [2*Pi] 603 // else : angle = eangle 598 604 float angle = j1 ? OppositeAngle(eangle[i1]): eangle[i1]; 599 n = *pn; 600 if (angleold > angle) // exch to have : po -> pn -> p 601 exch=1,*pn = *po,*po=*p,*p=n,po = pn; 602 else // to have : po -> p -> pn 603 angleold = angle, po = p,p = pn; 604 } 605 } 606 607 // angulare test to find a corner 605 n=*pn; // n = ev[n] (n = ev[7] = 0) 606 if (angleold > angle){ // exch to have : po -> pn -> p 607 exch=1, *pn=*po, *po=*p, *p=n, po=pn; 608 } 609 else{ // to have : po -> p -> pn 610 angleold=angle, po=p, p=pn; 611 } 612 } 613 } 614 //first iteration: i=0 615 //hv 0 2 4 6 616 //ev 7 -1 1 -1 3 -1 5 -1 617 618 // angular test on current vertex to guess whether it is a corner 608 619 if(ord == 2) { 609 Int4 n1 = hv[i]; 610 Int4 n2 = ev[n1]; 611 Int4 i1 = n1 /2, i2 = n2/2; // edge number 612 Int4 j1 = n1 %2, j2 = n2%2; // vertex in the edge 620 Int4 n1 = hv[i]; 621 Int4 n2 = ev[n1]; 622 Int4 i1 = n1/2, i2 = n2/2; // edge number 623 Int4 j1 = n1%2, j2 = n2%2; // vertex in the edge 624 /*//first iteration i=0 625 //n1=hv[i]=0 626 //n2=ev[i]=7 627 //i1 = 0 i2 = 3 628 //j1 = 0 j2 = 1 629 printf("i=%i\n",i); 630 printf("n1=hv[i]=%i\n",n1); 631 printf("n2=ev[i]=%i\n",n2); 632 printf("i1 = %i i2 = %i\n",i1,i2); 633 printf("j1 = %i j2 = %i\n",j1,j2);*/ 613 634 float angle1= j1 ? OppositeAngle(eangle[i1]) : eangle[i1]; 614 635 float angle2= !j2 ? OppositeAngle(eangle[i2]) : eangle[i2]; … … 638 659 k =0; 639 660 for (i=0;i<nbe;i++){ 640 for (j j=0;jj<2;jj++){661 for (j=0;j<2;j++){ 641 662 Int4 n1 = ev[k++]; 642 663 Int4 i1 = n1/2 ,j1=n1%2; 643 if( edges[i1].v[j1] != edges[i].v[j j]) {664 if( edges[i1].v[j1] != edges[i].v[j]) { 644 665 throw ErrorException(__FUNCT__,exprintf("Bug Adj edge")); 645 666 } 646 667 edges[i1].Adj[j1] = edges + i; 647 edges[i1].DirAdj[j1] = j j;668 edges[i1].DirAdj[j1] = j; 648 669 } 649 670 } … … 776 797 } 777 798 /*}}}1*/ 799 /*FUNCTION Geometry::Echo {{{1*/ 800 801 void Geometry::Echo(void){ 802 803 printf("Geometry:\n"); 804 printf(" name: %s\n",name); 805 printf(" nbvx (maximum number of vertices) : %i\n",nbvx); 806 printf(" nbtx (maximum number of triangles): %i\n",nbtx); 807 printf(" nbv (number of vertices) : %i\n",nbv); 808 printf(" nbt (number of triangles): %i\n",nbt); 809 printf(" nbe (number of edges) : %i\n",nbe); 810 printf(" nbv (number of initial vertices) : %i\n",nbiv); 811 printf(" NbSubDomains: %i\n",NbSubDomains); 812 printf(" NbEquiEdges: %i\n",NbEquiEdges); 813 printf(" NbCrackedEdges: %i\n",NbCrackedEdges); 814 printf(" NbOfCurves: %i\n",NbOfCurves); 815 printf(" vertices: %p\n",vertices); 816 printf(" triangles: %p\n",triangles); 817 printf(" edges: %p\n",edges); 818 printf(" quadtree: %p\n",quadtree); 819 printf(" subdomains: %p\n",subdomains); 820 printf(" curves: %p\n",curves); 821 printf(" pmin (x,y): (%g %g)\n",pmin.x,pmin.y); 822 printf(" pmax (x,y): (%g %g)\n",pmax.x,pmax.y); 823 printf(" coefIcoor: %g\n",coefIcoor); 824 printf(" MaximalAngleOfCorner: %g\n",MaximalAngleOfCorner); 825 826 return; 827 } 828 /*}}}*/ 778 829 /*FUNCTION Geometry::EmptyGeometry(){{{1*/ 779 830 void Geometry::EmptyGeometry() { -
issm/trunk/src/c/Bamgx/objects/MatVVP2x2.cpp
r2865 r2899 47 47 /*}}}1*/ 48 48 49 /*Methods*/ 50 /*FUNCTION MatVVP2x2::Echo {{{1*/ 51 52 void MatVVP2x2::Echo(void){ 53 54 printf("MatVVP2x2:\n"); 55 printf(" lambda1: %g\n",lambda1); 56 printf(" lambda2: %g\n",lambda2); 57 printf(" v.x: %g\n",v.x); 58 printf(" v.y: %g\n",v.y); 59 60 return; 61 } 62 /*}}}*/ 63 49 64 } -
issm/trunk/src/c/Bamgx/objects/MetricAnIso.cpp
r2865 r2899 59 59 60 60 /*Methods*/ 61 /*FUNCTION MetricAnIso::Echo {{{1*/ 62 63 void MetricAnIso::Echo(void){ 64 65 printf("MetricAnIso:\n"); 66 printf(" [a11 a21 a22]: [%g %g %g]\n",a11,a21,a22); 67 68 return; 69 } 70 /*}}}*/ 61 71 /*FUNCTION MetricAnIso::IntersectWith{{{1*/ 62 72 int MetricAnIso::IntersectWith(const MetricAnIso M2) { -
issm/trunk/src/c/Bamgx/objects/Triangles.cpp
r2877 r2899 325 325 hvertices=1; 326 326 for (i=0;i< nbv;i++){ 327 vertices[i].m=Metric((Real4)bamgmesh->hVertices[i]); 327 if (!isnan(bamgmesh->hVertices[i])){ 328 vertices[i].m=Metric((Real4)bamgmesh->hVertices[i]); 329 } 328 330 } 329 331 } … … 689 691 } 690 692 else if (j==3){ 691 Real8 a,b,c; 692 a=bamgopts->metric[i*3+0]; 693 b=bamgopts->metric[i*3+1]; 694 c=bamgopts->metric[i*3+2]; 695 MetricAnIso M(a,b,c); 696 MatVVP2x2 Vp(M/coef); 697 698 Vp.Maxh(hmin); 699 Vp.Minh(hmax); 700 vertices[i].m = Vp; 693 //do not erase metric computed by hVertices 694 if (vertices[i].m.a11==1 && vertices[i].m.a21==0 && vertices[i].m.a22==1){ 695 Real8 a,b,c; 696 a=bamgopts->metric[i*3+0]; 697 b=bamgopts->metric[i*3+1]; 698 c=bamgopts->metric[i*3+2]; 699 MetricAnIso M(a,b,c); 700 MatVVP2x2 Vp(M/coef); 701 702 Vp.Maxh(hmin); 703 Vp.Minh(hmax); 704 vertices[i].m = Vp; 705 } 701 706 } 702 707 } … … 2723 2728 /*}}}1*/ 2724 2729 /*FUNCTION Triangles::IntersectConsMetric{{{1*/ 2725 void Triangles::IntersectConsMetric(const double 2730 void Triangles::IntersectConsMetric(const double* s,const Int4 nbsol,const int * typsols, 2726 2731 const Real8 hmin1,const Real8 hmax1,const Real8 coef, 2727 2732 const Real8 anisomax ,const Real8 CutOff,const int NbJacobi, 2728 const int DoNormalisation,const double power,const int choice) 2729 {// the array of solution s is store2733 const int DoNormalisation,const double power,const int choice){ 2734 // the array of solution s is store 2730 2735 // sol0,sol1,...,soln on vertex 0 2731 2736 // sol0,sol1,...,soln on vertex 1 2732 2737 // etc. 2733 // choise = 0 => H is computed with green formule 2734 // otherwise => H is computed from P2 on 4T 2738 // choise = 0 => H is computed with green formula 2739 // otherwise => H is computed from P2 on 4T 2740 2735 2741 const int dim = 2; 2736 2737 2742 long int verbosity=0; 2738 2743 … … 2741 2746 // computation of the nb of field 2742 2747 Int4 ntmp = 0; 2743 if (typsols) 2744 { 2745 for (Int4 i=0;i<nbsol;i++) 2746 ntmp += sizeoftype[typsols[i]]; 2748 if (typsols){ 2749 for (Int4 i=0;i<nbsol;i++) ntmp += sizeoftype[typsols[i]]; 2747 2750 } 2748 else 2749 ntmp = nbsol; 2751 else ntmp = nbsol; 2750 2752 2751 2753 // n is the total number of fields … … 2768 2770 else printf(" Absolute error\n"); 2769 2771 } 2770 double *ss=(double*)s;2772 double* ss=(double*)s; 2771 2773 2772 2774 double sA,sB,sC; … … 2781 2783 Real8 *workV= new Real8[nbv]; 2782 2784 int *OnBoundary = new int[nbv]; 2783 for (iv=0;iv<nbv;iv++) 2784 { 2785 for (iv=0;iv<nbv;iv++){ 2785 2786 Mmass[iv]=0; 2786 2787 OnBoundary[iv]=0; 2787 2788 Mmassxx[iv]=0; 2788 2789 } 2789 2790 2790 2791 for (i=0;i<nbt;i++) 2791 if(triangles[i].link) // the real triangles 2792 { 2792 if(triangles[i].link){ // the real triangles 2793 2793 const Triangle &t=triangles[i]; 2794 2794 // coor of 3 vertices … … 2823 2823 Mmass[iC] += dett; 2824 2824 2825 if((nbb==0)|| !choice) 2826 { 2825 if((nbb==0)|| !choice){ 2827 2826 Mmassxx[iA] += dett; 2828 2827 Mmassxx[iB] += dett; … … 2830 2829 } 2831 2830 } 2832 else 2833 workT[i]=-1; 2834 2835 for (Int4 nusol=0;nusol<nbsol;nusol++) 2836 { //for all Solution 2831 else workT[i]=-1; 2832 2833 for (Int4 nusol=0;nusol<nbsol;nusol++) { 2834 //for all Solution 2837 2835 2838 2836 Real8 smin=ss[0],smax=ss[0]; … … 2843 2841 int nbfield = typsols? sizeoftype[typsols[nusol]] : 1; 2844 2842 if (nbfield == 1) 2845 for ( iv=0,k=0; iv<nbv; iv++,k+=n ) 2846 { 2843 for ( iv=0,k=0; iv<nbv; iv++,k+=n ){ 2847 2844 dxdx[iv]=dxdy[iv]=dydy[iv]=0; 2848 2845 smin=Min(smin,ss[k]); 2849 2846 smax=Max(smax,ss[k]); 2850 } 2851 else 2852 { 2847 } 2848 else{ 2853 2849 // cas vectoriel 2854 for ( iv=0,k=0; iv<nbv; iv++,k+=n ) 2855 { 2850 for ( iv=0,k=0; iv<nbv; iv++,k+=n ){ 2856 2851 double v=0; 2857 2852 for (int i=0;i<nbfield;i++) … … 2860 2855 smin=Min(smin,v); 2861 2856 smax=Max(smax,v); 2862 2863 2857 } 2858 } 2864 2859 Real8 sdelta = smax-smin; 2865 2860 Real8 absmax=Max(Abs(smin),Abs(smax)); … … 2874 2869 2875 2870 double *sf = ss; 2876 for (Int4 nufield=0;nufield<nbfield;nufield++,ss++) 2877 { 2871 for (Int4 nufield=0;nufield<nbfield;nufield++,ss++){ 2878 2872 for ( iv=0,k=0; iv<nbv; iv++,k+=n ) 2879 2873 dxdx[iv]=dxdy[iv]=dydy[iv]=0; … … 3035 3029 else kk++; 3036 3030 3037 3038 // correction of second derivate 3031 // correction of second derivative 3039 3032 // by a laplacien 3040 3041 3033 Real8 *d2[3] = { dxdx, dxdy, dydy}; 3042 3034 Real8 *dd; 3043 for (int xy = 0;xy<3;xy++) 3044 { 3035 for (int xy = 0;xy<3;xy++) { 3045 3036 dd = d2[xy]; 3046 3037 // do leat 2 iteration for boundary problem 3047 for (int ijacobi=0;ijacobi<Max(NbJacobi,2);ijacobi++) 3048 { 3038 for (int ijacobi=0;ijacobi<Max(NbJacobi,2);ijacobi++){ 3049 3039 for (i=0;i<nbt;i++) 3050 3040 if(triangles[i].link) // the real triangles … … 3078 3068 if( ijacobi<NbJacobi || OnBoundary[iv]) 3079 3069 dd[iv] = workV[iv]/(Mmass[iv]*6); 3080 3081 3082 } 3083 3084 3085 } 3070 } 3071 } 3086 3072 3087 3073 // constuction of the metrix from the Hessian dxdx. dxdy,dydy 3088 3089 3074 Real8 rCutOff=CutOff*absmax;// relative cut off 3090 3075 … … 3107 3092 3108 3093 Vp.Abs(); 3109 if(power!=1.0) 3110 Vp.pow(power); 3111 3112 3094 if(power!=1.0) Vp.pow(power); 3113 3095 3114 3096 h1=Min(h1,Vp.lmin()); … … 3128 3110 Metric MVp(Vp); 3129 3111 vertices[iv].m.IntersectWith(MVp); 3112 //vertices[iv].m=Vp; TEST: work like that 3130 3113 }// for all vertices 3131 if (verbosity>2) { 3114 //vertices[nbv-1].m.Echo(); 3115 if (verbosity>-1) { 3132 3116 printf(" Field %i of solution %i\n",nufield,nusol); 3133 3117 printf(" before bounding : Hmin = %g, Hmax = %g, factor of anisotropy max = %g\n",pow(h2,-0.5), pow(h1,-0.5), pow(rx,0.5)); … … 3135 3119 } 3136 3120 } // end of for all field 3137 3121 }// end for all solution 3138 3122 3139 3123 delete [] detT; -
issm/trunk/src/c/objects/BamgOpts.h
r2790 r2899 18 18 int verbose; 19 19 double* metric; 20 double* field; 20 21 21 22 }; -
issm/trunk/src/m/classes/public/bamg.m
r2794 r2899 35 35 bamg_geometry.Vertices=[bamg_geometry.Vertices; [domain(i).x(1:nods) domain(i).y(1:nods) ones(nods,1)]]; 36 36 bamg_geometry.Edges=[bamg_geometry.Edges; [transp(count+1:count+nods) transp([count+2:count+nods count+1]) ones(nods,1)]]; 37 bamg_geometry.hVertices=[];%[bamg_geometry.hVertices; resolution*ones(nods,1)];38 37 if i>1, 39 38 clockwise=-1; … … 41 40 end 42 41 count=count+nods; 42 end 43 if exist(options,'hVertices'), 44 bamg_geometry.hVertices=getfieldvalueerr(options,'hVertices'); 45 if length(bamg_geometry.hVertices)~=nods, 46 error(['hVertices option should be of size [' num2str(nods) ',1]']); 47 end 43 48 end 44 49 bamg_geometry.NumVertices=size(bamg_geometry.Vertices,1); … … 55 60 bamg_mesh.Triangles=[]; 56 61 bamg_mesh.index=zeros(0,3); 62 bamg_mesh.hVertices=[]; 57 63 if (~exist(options,'domain') & md.numberofgrids~=0 & strcmpi(md.type,'2d')), 58 64 bamg_mesh.NumVertices=md.numberofgrids; … … 60 66 bamg_mesh.NumTriangles=md.numberofelements; 61 67 bamg_mesh.Triangles=[md.elements ones(md.numberofelements,1)]; 68 if exist(options,'hVertices'), 69 bamg_mesh.hVertices=getfieldvalueerr(options,'hVertices'); 70 if length(bamg_mesh.hVertices)~=md.numberofgrids, 71 error(['hVertices option should be of size [' num2str(md.numberofgrids) ',1]']); 72 end 73 end 62 74 end 63 75 %}}} … … 74 86 bamg_options.splitcorners=getfieldvalue(options,'splitcorners',1); 75 87 bamg_options.metric=getfieldvalue(options,'metric',zeros(0,3)); 88 bamg_options.field=getfieldvalue(options,'field',zeros(0,1)); 76 89 %}}} 77 90 78 91 %call Bamg 79 [triangles vertices ]=Bamg(bamg_mesh,bamg_geometry,bamg_options);92 [triangles vertices metric]=Bamg(bamg_mesh,bamg_geometry,bamg_options); 80 93 81 94 % plug results onto model … … 83 96 md.y=vertices(:,2); 84 97 md.elements=triangles(:,1:3); 98 md.dummy=metric; 85 99 86 100 %Fill in rest of fields: -
issm/trunk/src/mex/Bamg/Bamg.cpp
r2798 r2899 9 9 int noerr=1; 10 10 int i; 11 int nods=0; //to be removed 11 12 BamgOpts bamgopts; 12 13 BamgMesh bamgmesh; … … 18 19 int NumTrianglesMesh; 19 20 double* TrianglesMesh=NULL; 21 double* hVerticesMesh=NULL; 20 22 21 23 /*Geom inputs: */ … … 34 36 double gradation; 35 37 double cutoff; 36 double* metric; 38 double* metric=NULL; 39 double* field=NULL; 37 40 38 41 /*Boot module: */ … … 79 82 FetchData(&TrianglesMesh,NULL,NULL,mxGetField(BAMGMESH,0,"Triangles")); 80 83 bamgmesh.Triangles=TrianglesMesh; 81 bamgmesh.hVertices=NULL; 84 FetchData(&hVerticesMesh,NULL,NULL,mxGetField(BAMGMESH,0,"hVertices")); 85 bamgmesh.hVertices=hVerticesMesh; 82 86 bamgmesh.NumQuadrilaterals=0; 83 87 bamgmesh.Quadrilaterals=NULL; … … 118 122 FetchData(&metric,NULL,NULL,mxGetField(BAMGOPTIONS,0,"metric")); 119 123 bamgopts.metric=metric; 124 FetchData(&field,NULL,NULL,mxGetField(BAMGOPTIONS,0,"field")); 125 bamgopts.field=field; 120 126 121 127 /*!Generate internal degree of freedom numbers: */ 128 nods=bamgmesh.NumVertices; 122 129 Bamgx(&bamgmesh,&bamggeom,&bamgopts); 123 130 … … 125 132 WriteData(TRIANGLESOUT,bamgmesh.Triangles,bamgmesh.NumTriangles,4); 126 133 WriteData(VERTICESOUT,bamgmesh.Vertices,bamgmesh.NumVertices,3); 134 WriteData(METRICOUT,bamgopts.metric,nods,3); 127 135 128 136 /*Free ressources: */ -
issm/trunk/src/mex/Bamg/Bamg.h
r2785 r2899 25 25 #define TRIANGLESOUT (mxArray**)&plhs[0] 26 26 #define VERTICESOUT (mxArray**)&plhs[1] 27 #define METRICOUT (mxArray**)&plhs[2] 27 28 28 29 /* serial arg counts: */ 29 30 #undef NLHS 30 #define NLHS 231 #define NLHS 3 31 32 #undef NRHS 32 33 #define NRHS 3
Note:
See TracChangeset
for help on using the changeset viewer.