source:
issm/oecreview/Archive/21724-22754/ISSM-22497-22498.diff
Last change on this file was 22755, checked in by , 7 years ago | |
---|---|
File size: 150.8 KB |
-
../trunk-jpl/src/c/modules/TriMeshx/TriMeshx.cpp
1 /*!\file TriMeshx2 * \brief: x code for TriMesh mesher3 */4 5 /*Header files: {{{*/6 #include "./TriMeshx.h"7 #include "../../shared/shared.h"8 #include "../../toolkits/toolkits.h"9 /*ANSI_DECLARATORS needed to call triangle library: */10 #if defined(_HAVE_TRIANGLE_)11 #ifndef ANSI_DECLARATORS12 #define ANSI_DECLARATORS13 #endif14 #include "triangle.h"15 #undef ANSI_DECLARATORS16 #endif17 /*}}}*/18 19 void TriMeshx(int** pindex,IssmPDouble** px,IssmPDouble** py,int** psegments,int** psegmentmarkerlist,int* pnels,int* pnods, int* pnsegs,Contours* domain,Contours* rifts,double area){20 21 #if !defined(_HAVE_TRIANGLE_)22 _error_("triangle has not been installed");23 #else24 /*indexing: */25 int i,j;26 27 /*output: */28 int *index = NULL;29 double *x = NULL;30 double *y = NULL;31 int *segments = NULL;32 int *segmentmarkerlist = NULL;33 34 /*intermediary: */35 int counter,counter2,backcounter;36 Contour<IssmPDouble> *contour = NULL;37 38 /* Triangle structures needed to call Triangle library routines: */39 struct triangulateio in,out;40 char options[256];41 42 /*Create initial triangulation to call triangulate(). First number of points:*/43 in.numberofpoints=0;44 for (i=0;i<domain->Size();i++){45 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);46 in.numberofpoints+=contour->nods-1;47 }48 for (i=0;i<rifts->Size();i++){49 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);50 in.numberofpoints+=contour->nods;51 }52 53 /*number of point attributes: */54 in.numberofpointattributes=1;55 56 /*fill in the point list: */57 in.pointlist = xNew<REAL>(in.numberofpoints*2);58 59 counter=0;60 for (i=0;i<domain->Size();i++){61 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);62 for (j=0;j<contour->nods-1;j++){63 in.pointlist[2*counter+0]=contour->x[j];64 in.pointlist[2*counter+1]=contour->y[j];65 counter++;66 }67 }68 for (i=0;i<rifts->Size();i++){69 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);70 for (j=0;j<contour->nods;j++){71 in.pointlist[2*counter+0]=contour->x[j];72 in.pointlist[2*counter+1]=contour->y[j];73 counter++;74 }75 }76 77 /*fill in the point attribute list: */78 in.pointattributelist = xNew<REAL>(in.numberofpoints*in.numberofpointattributes);79 for (i=0;i<in.numberofpoints;i++) in.pointattributelist[i] = 0.0;80 81 /*fill in the point marker list: */82 in.pointmarkerlist = xNew<int>(in.numberofpoints);83 for(i=0;i<in.numberofpoints;i++) in.pointmarkerlist[i] = 0;84 85 /*Build segments. First figure out number of segments: holes and closed outlines have as many segments as vertices: */86 in.numberofsegments=0;87 for (i=0;i<domain->Size();i++){88 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);89 in.numberofsegments+=contour->nods-1;90 }91 for(i=0;i<rifts->Size();i++){92 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);93 /*for rifts, we have one less segment as we have vertices*/94 in.numberofsegments+=contour->nods-1;95 }96 97 in.segmentlist = xNew<int>(in.numberofsegments*2);98 in.segmentmarkerlist = xNewZeroInit<int>(in.numberofsegments);99 counter=0;100 backcounter=0;101 for (i=0;i<domain->Size();i++){102 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i);103 for (j=0;j<contour->nods-2;j++){104 in.segmentlist[2*counter+0]=counter;105 in.segmentlist[2*counter+1]=counter+1;106 in.segmentmarkerlist[counter]=0;107 counter++;108 }109 /*Close this profile: */110 in.segmentlist[2*counter+0]=counter;111 in.segmentlist[2*counter+1]=backcounter;112 in.segmentmarkerlist[counter]=0;113 counter++;114 backcounter=counter;115 }116 counter2=counter;117 for (i=0;i<rifts->Size();i++){118 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i);119 for (j=0;j<(contour->nods-1);j++){120 in.segmentlist[2*counter2+0]=counter;121 in.segmentlist[2*counter2+1]=counter+1;122 in.segmentmarkerlist[counter2]=2+i;123 counter2++;124 counter++;125 }126 counter++;127 }128 129 /*Build regions: */130 in.numberofregions = 0;131 132 /*Build holes: */133 in.numberofholes = domain->Size()-1; /*everything is a hole, but for the first profile.*/134 if(in.numberofholes){135 in.holelist = xNew<REAL>(in.numberofholes*2);136 for (i=0;i<domain->Size()-1;i++){137 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i+1);138 GridInsideHole(&in.holelist[2*i+0],&in.holelist[2*i+1],contour->nods-1,contour->x,contour->y);139 }140 }141 142 /* Make necessary initializations so that Triangle can return a triangulation in `out': */143 out.pointlist = (REAL*)NULL;144 out.pointattributelist = (REAL*)NULL;145 out.pointmarkerlist = (int *)NULL;146 out.trianglelist = (int *)NULL;147 out.triangleattributelist = (REAL*)NULL;148 out.neighborlist = (int *)NULL;149 out.segmentlist = (int *)NULL;150 out.segmentmarkerlist = (int *)NULL;151 out.edgelist = (int *)NULL;152 out.edgemarkerlist = (int *)NULL;153 154 /* Triangulate the points:. Switches are chosen to read and write a */155 /* PSLG (p), preserve the convex hull (c), number everything from */156 /* zero (z), assign a regional attribute to each element (A), and */157 /* produce an edge list (e), a Voronoi diagram (v), and a triangle */158 /* neighbor list (n). */159 sprintf(options,"%s%lf","pQzDq30ia",area); /*replace V by Q to quiet down the logging*/160 triangulate(options, &in, &out, NULL);161 /*report(&out, 0, 1, 1, 1, 1, 0);*/162 163 /*Allocate index, x and y: */164 index=xNew<int>(3*out.numberoftriangles);165 x=xNew<double>(out.numberofpoints);166 y=xNew<double>(out.numberofpoints);167 segments=xNew<int>(3*out.numberofsegments);168 segmentmarkerlist=xNew<int>(out.numberofsegments);169 170 for (i = 0; i< out.numberoftriangles; i++) {171 for (j = 0; j < out.numberofcorners; j++) {172 index[3*i+j]=(int)out.trianglelist[i*out.numberofcorners+j]+1;173 }174 }175 for (i = 0; i< out.numberofpoints; i++){176 x[i]=(double)out.pointlist[i*2+0];177 y[i]=(double)out.pointlist[i*2+1];178 }179 for (i = 0; i<out.numberofsegments;i++){180 segments[3*i+0]=(int)out.segmentlist[i*2+0]+1;181 segments[3*i+1]=(int)out.segmentlist[i*2+1]+1;182 segmentmarkerlist[i]=(int)out.segmentmarkerlist[i];183 }184 185 /*Associate elements with segments: */186 AssociateSegmentToElement(&segments,out.numberofsegments,index,out.numberoftriangles);187 188 /*Order segments so that their normals point outside the domain: */189 OrderSegments(&segments,out.numberofsegments, index,out.numberoftriangles);190 191 /*Output : */192 *pindex=index;193 *px=x;194 *py=y;195 *psegments=segments;196 *psegmentmarkerlist=segmentmarkerlist;197 *pnels=out.numberoftriangles;198 *pnods=out.numberofpoints;199 *pnsegs=out.numberofsegments;200 #endif201 } -
../trunk-jpl/src/c/modules/TriMeshx/TriMeshx.h
1 /*!\file: TriMeshx.h2 * \brief header file for TriMeshx module3 */4 5 #ifndef _TRIMESHX_H_6 #define _TRIMESHX_H_7 8 #include <string.h>9 #include "../../classes/classes.h"10 11 /* local prototypes: */12 void TriMeshx(int** pindex,IssmPDouble** px,IssmPDouble** py,int** psegments,int** psegmentmarkerlist,int* pnels,int* pnods, int* pnseg,Contours* domain,Contours* rifts,double area);13 #endif /* _TRIMESHX_H */ -
../trunk-jpl/src/c/modules/TriMeshx
-
../trunk-jpl/src/c/modules/TriMeshProcessRiftsx/TriMeshProcessRiftsx.h
Property changes on: ../trunk-jpl/src/c/modules/TriMeshx ___________________________________________________________________ Deleted: svn:ignore ## -1,2 +0,0 ## -.deps -.dirstamp
1 /*!\file: TriMeshProcessRiftsx.h2 * \brief header file for TriMeshProcessRifts module3 */4 5 #ifndef _TRIMESHPROCESSRIFTX_H6 #define _TRIMESHPROCESSRIFTX_H7 8 class RiftStruct;9 10 void TriMeshProcessRiftsx(int** pindex,int* pnel,double** px,double** py,int* pnods,int** psegments,int** psegmentmarkers,int *pnum_seg,RiftStruct **priftstruct);11 12 #endif /* _TRIMESHPROCESSRIFTX_H*/ -
../trunk-jpl/src/c/modules/TriMeshProcessRiftsx/TriMeshProcessRiftsx.cpp
1 /*!\file: TriMeshProcessRifts.cpp2 * \brief split a mesh where a rift (or fault) is present3 */4 5 #include "./TriMeshProcessRiftsx.h"6 #include "../../classes/RiftStruct.h"7 #include "../../shared/shared.h"8 #include "../../toolkits/toolkits.h"9 10 void TriMeshProcessRiftsx(int** pindex, int* pnel,double** px,double** py,int* pnods,int** psegments,int** psegmentmarkers,int *pnum_seg,RiftStruct **priftstruct){11 12 /*Output*/13 int numrifts,numrifts0;14 int *riftsnumsegments = NULL;15 int **riftssegments = NULL;16 int *riftsnumpairs = NULL;17 int **riftspairs = NULL;18 int *riftstips = NULL;19 double **riftspenaltypairs = NULL;20 int *riftsnumpenaltypairs = NULL;21 22 /*Recover initial mesh*/23 int nel = *pnel;24 int *index = *pindex;25 double *x = *px;26 double *y = *py;27 int nods = *pnods;28 int *segments = *psegments;29 int *segmentmarkers = *psegmentmarkers;30 int num_seg = *pnum_seg;31 32 /*Intermediary*/33 int riftflag;34 35 /*First, do some fixing on the existing mesh: we do not want any element belonging entirely to the segment list (ie:36 *all the nodes of this element belong to the segments (tends to happen when there are corners: */37 RemoveCornersFromRifts(&index,&nel,&x,&y,&nods,segments,segmentmarkers,num_seg);38 39 /*Figure out if we have rifts, and how many: */40 IsRiftPresent(&riftflag,&numrifts0,segmentmarkers,num_seg);41 42 if(!riftflag) _error_("No rift present in mesh");43 44 /*Split mesh*/45 SplitMeshForRifts(&nel,&index,&nods,&x,&y,&num_seg,&segments,&segmentmarkers);46 47 /*Order segments so that their normals point outside the domain: */48 OrderSegments(&segments,num_seg, index,nel);49 50 /*We do not want to output segments mixed with rift segments: wring out the rifts from the segments, using the51 *segmentmarkerlist:*/52 SplitRiftSegments(&segments,&segmentmarkers,&num_seg,&numrifts,&riftsnumsegments,&riftssegments,numrifts0,nods,nel);53 54 /*Using rift segments, associate rift faces in pairs, each pair face representing opposite flanks of the rifts facing one another directly: */55 PairRiftElements(&riftsnumpairs,&riftspairs,numrifts,riftsnumsegments,riftssegments,x,y);56 57 /*Order rifts so that they start from one tip, go to the other tip, and back: */58 OrderRifts(&riftstips,riftssegments,riftspairs,numrifts,riftsnumsegments,x,y,nods,nel);59 60 /*Create penalty pairs, used by Imp: */61 PenaltyPairs(&riftspenaltypairs,&riftsnumpenaltypairs,numrifts,riftssegments,riftsnumsegments,riftspairs,riftstips,x,y);62 63 /*Create Riftstruct*/64 RiftStruct* riftstruct = new RiftStruct(numrifts,riftsnumsegments,riftssegments,riftsnumpairs,riftspairs,riftsnumpenaltypairs,riftspenaltypairs,riftstips);65 66 /*Assign output pointers for mesh*/67 *pnel = nel;68 *pindex = index;69 *px = x;70 *py = y;71 *pnods = nods;72 *psegments = segments;73 *psegmentmarkers = segmentmarkers;74 *pnum_seg = num_seg;75 76 /*Assign output pointers for rifts*/77 *priftstruct = riftstruct;78 } -
../trunk-jpl/src/c/modules/TriMeshProcessRiftsx
-
../trunk-jpl/src/c/modules/modules.h
Property changes on: ../trunk-jpl/src/c/modules/TriMeshProcessRiftsx ___________________________________________________________________ Deleted: svn:ignore ## -1,2 +0,0 ## -.deps -.dirstamp
90 90 #include "./SystemMatricesx/SystemMatricesx.h" 91 91 #include "./SpcNodesx/SpcNodesx.h" 92 92 #include "./SurfaceAreax/SurfaceAreax.h" 93 #include "./Tri Meshx/TriMeshx.h"94 #include "./ TriMeshProcessRiftsx/TriMeshProcessRiftsx.h"93 #include "./Trianglex/Trianglex.h" 94 #include "./ProcessRiftsx/ProcessRiftsx.h" 95 95 #include "./ThicknessAbsMisfitx/ThicknessAbsMisfitx.h" 96 96 #include "./ThicknessAlongGradientx/ThicknessAlongGradientx.h" 97 97 #include "./ThicknessAcrossGradientx/ThicknessAcrossGradientx.h" -
../trunk-jpl/src/c/modules/ProcessRiftsx/ProcessRiftsx.h
1 /*!\file: ProcessRiftsx.h 2 * \brief header file for ProcessRifts module 3 */ 4 5 #ifndef _PROCESSRIFTX_H 6 #define _PROCESSRIFTX_H 7 8 class RiftStruct; 9 10 void ProcessRiftsx(int** pindex,int* pnel,double** px,double** py,int* pnods,int** psegments,int** psegmentmarkers,int *pnum_seg,RiftStruct **priftstruct); 11 12 #endif /* _PROCESSRIFTX_H*/ -
../trunk-jpl/src/c/modules/ProcessRiftsx/ProcessRiftsx.cpp
1 /*!\file: ProcessRifts.cpp 2 * \brief split a mesh where a rift (or fault) is present 3 */ 4 5 #include "./ProcessRiftsx.h" 6 #include "../../classes/RiftStruct.h" 7 #include "../../shared/shared.h" 8 #include "../../toolkits/toolkits.h" 9 10 void ProcessRiftsx(int** pindex, int* pnel,double** px,double** py,int* pnods,int** psegments,int** psegmentmarkers,int *pnum_seg,RiftStruct **priftstruct){ 11 12 /*Output*/ 13 int numrifts,numrifts0; 14 int *riftsnumsegments = NULL; 15 int **riftssegments = NULL; 16 int *riftsnumpairs = NULL; 17 int **riftspairs = NULL; 18 int *riftstips = NULL; 19 double **riftspenaltypairs = NULL; 20 int *riftsnumpenaltypairs = NULL; 21 22 /*Recover initial mesh*/ 23 int nel = *pnel; 24 int *index = *pindex; 25 double *x = *px; 26 double *y = *py; 27 int nods = *pnods; 28 int *segments = *psegments; 29 int *segmentmarkers = *psegmentmarkers; 30 int num_seg = *pnum_seg; 31 32 /*Intermediary*/ 33 int riftflag; 34 35 /*First, do some fixing on the existing mesh: we do not want any element belonging entirely to the segment list (ie: 36 *all the nodes of this element belong to the segments (tends to happen when there are corners: */ 37 RemoveCornersFromRifts(&index,&nel,&x,&y,&nods,segments,segmentmarkers,num_seg); 38 39 /*Figure out if we have rifts, and how many: */ 40 IsRiftPresent(&riftflag,&numrifts0,segmentmarkers,num_seg); 41 42 if(!riftflag) _error_("No rift present in mesh"); 43 44 /*Split mesh*/ 45 SplitMeshForRifts(&nel,&index,&nods,&x,&y,&num_seg,&segments,&segmentmarkers); 46 47 /*Order segments so that their normals point outside the domain: */ 48 OrderSegments(&segments,num_seg, index,nel); 49 50 /*We do not want to output segments mixed with rift segments: wring out the rifts from the segments, using the 51 *segmentmarkerlist:*/ 52 SplitRiftSegments(&segments,&segmentmarkers,&num_seg,&numrifts,&riftsnumsegments,&riftssegments,numrifts0,nods,nel); 53 54 /*Using rift segments, associate rift faces in pairs, each pair face representing opposite flanks of the rifts facing one another directly: */ 55 PairRiftElements(&riftsnumpairs,&riftspairs,numrifts,riftsnumsegments,riftssegments,x,y); 56 57 /*Order rifts so that they start from one tip, go to the other tip, and back: */ 58 OrderRifts(&riftstips,riftssegments,riftspairs,numrifts,riftsnumsegments,x,y,nods,nel); 59 60 /*Create penalty pairs, used by Imp: */ 61 PenaltyPairs(&riftspenaltypairs,&riftsnumpenaltypairs,numrifts,riftssegments,riftsnumsegments,riftspairs,riftstips,x,y); 62 63 /*Create Riftstruct*/ 64 RiftStruct* riftstruct = new RiftStruct(numrifts,riftsnumsegments,riftssegments,riftsnumpairs,riftspairs,riftsnumpenaltypairs,riftspenaltypairs,riftstips); 65 66 /*Assign output pointers for mesh*/ 67 *pnel = nel; 68 *pindex = index; 69 *px = x; 70 *py = y; 71 *pnods = nods; 72 *psegments = segments; 73 *psegmentmarkers = segmentmarkers; 74 *pnum_seg = num_seg; 75 76 /*Assign output pointers for rifts*/ 77 *priftstruct = riftstruct; 78 } -
../trunk-jpl/src/c/modules/ProcessRiftsx
-
../trunk-jpl/src/c/modules/Trianglex/Trianglex.h
Property changes on: ../trunk-jpl/src/c/modules/ProcessRiftsx ___________________________________________________________________ Added: svn:ignore ## -0,0 +1,2 ## +.deps +.dirstamp
1 /*!\file: Trianglex.h 2 * \brief header file for Trianglex module 3 */ 4 5 #ifndef _TRIANGLEX_H_ 6 #define _TRIANGLEX_H_ 7 8 #include <string.h> 9 #include "../../classes/classes.h" 10 11 /* local prototypes: */ 12 void Trianglex(int** pindex,IssmPDouble** px,IssmPDouble** py,int** psegments,int** psegmentmarkerlist,int* pnels,int* pnods, int* pnseg,Contours* domain,Contours* rifts,double area); 13 #endif /* _TRIANGLEX_H */ -
../trunk-jpl/src/c/modules/Trianglex/Trianglex.cpp
1 /*!\file Trianglex 2 * \brief: x code for Triangle mesher 3 */ 4 5 /*Header files: {{{*/ 6 #include "./Trianglex.h" 7 #include "../../shared/shared.h" 8 #include "../../toolkits/toolkits.h" 9 /*ANSI_DECLARATORS needed to call triangle library: */ 10 #if defined(_HAVE_TRIANGLE_) 11 #ifndef ANSI_DECLARATORS 12 #define ANSI_DECLARATORS 13 #endif 14 #include "triangle.h" 15 #undef ANSI_DECLARATORS 16 #endif 17 /*}}}*/ 18 19 void Trianglex(int** pindex,IssmPDouble** px,IssmPDouble** py,int** psegments,int** psegmentmarkerlist,int* pnels,int* pnods, int* pnsegs,Contours* domain,Contours* rifts,double area){ 20 21 #if !defined(_HAVE_TRIANGLE_) 22 _error_("triangle has not been installed"); 23 #else 24 /*indexing: */ 25 int i,j; 26 27 /*output: */ 28 int *index = NULL; 29 double *x = NULL; 30 double *y = NULL; 31 int *segments = NULL; 32 int *segmentmarkerlist = NULL; 33 34 /*intermediary: */ 35 int counter,counter2,backcounter; 36 Contour<IssmPDouble> *contour = NULL; 37 38 /* Triangle structures needed to call Triangle library routines: */ 39 struct triangulateio in,out; 40 char options[256]; 41 42 /*Create initial triangulation to call triangulate(). First number of points:*/ 43 in.numberofpoints=0; 44 for (i=0;i<domain->Size();i++){ 45 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i); 46 in.numberofpoints+=contour->nods-1; 47 } 48 for (i=0;i<rifts->Size();i++){ 49 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i); 50 in.numberofpoints+=contour->nods; 51 } 52 53 /*number of point attributes: */ 54 in.numberofpointattributes=1; 55 56 /*fill in the point list: */ 57 in.pointlist = xNew<REAL>(in.numberofpoints*2); 58 59 counter=0; 60 for (i=0;i<domain->Size();i++){ 61 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i); 62 for (j=0;j<contour->nods-1;j++){ 63 in.pointlist[2*counter+0]=contour->x[j]; 64 in.pointlist[2*counter+1]=contour->y[j]; 65 counter++; 66 } 67 } 68 for (i=0;i<rifts->Size();i++){ 69 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i); 70 for (j=0;j<contour->nods;j++){ 71 in.pointlist[2*counter+0]=contour->x[j]; 72 in.pointlist[2*counter+1]=contour->y[j]; 73 counter++; 74 } 75 } 76 77 /*fill in the point attribute list: */ 78 in.pointattributelist = xNew<REAL>(in.numberofpoints*in.numberofpointattributes); 79 for (i=0;i<in.numberofpoints;i++) in.pointattributelist[i] = 0.0; 80 81 /*fill in the point marker list: */ 82 in.pointmarkerlist = xNew<int>(in.numberofpoints); 83 for(i=0;i<in.numberofpoints;i++) in.pointmarkerlist[i] = 0; 84 85 /*Build segments. First figure out number of segments: holes and closed outlines have as many segments as vertices: */ 86 in.numberofsegments=0; 87 for (i=0;i<domain->Size();i++){ 88 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i); 89 in.numberofsegments+=contour->nods-1; 90 } 91 for(i=0;i<rifts->Size();i++){ 92 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i); 93 /*for rifts, we have one less segment as we have vertices*/ 94 in.numberofsegments+=contour->nods-1; 95 } 96 97 in.segmentlist = xNew<int>(in.numberofsegments*2); 98 in.segmentmarkerlist = xNewZeroInit<int>(in.numberofsegments); 99 counter=0; 100 backcounter=0; 101 for (i=0;i<domain->Size();i++){ 102 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i); 103 for (j=0;j<contour->nods-2;j++){ 104 in.segmentlist[2*counter+0]=counter; 105 in.segmentlist[2*counter+1]=counter+1; 106 in.segmentmarkerlist[counter]=0; 107 counter++; 108 } 109 /*Close this profile: */ 110 in.segmentlist[2*counter+0]=counter; 111 in.segmentlist[2*counter+1]=backcounter; 112 in.segmentmarkerlist[counter]=0; 113 counter++; 114 backcounter=counter; 115 } 116 counter2=counter; 117 for (i=0;i<rifts->Size();i++){ 118 contour=(Contour<IssmPDouble>*)rifts->GetObjectByOffset(i); 119 for (j=0;j<(contour->nods-1);j++){ 120 in.segmentlist[2*counter2+0]=counter; 121 in.segmentlist[2*counter2+1]=counter+1; 122 in.segmentmarkerlist[counter2]=2+i; 123 counter2++; 124 counter++; 125 } 126 counter++; 127 } 128 129 /*Build regions: */ 130 in.numberofregions = 0; 131 132 /*Build holes: */ 133 in.numberofholes = domain->Size()-1; /*everything is a hole, but for the first profile.*/ 134 if(in.numberofholes){ 135 in.holelist = xNew<REAL>(in.numberofholes*2); 136 for (i=0;i<domain->Size()-1;i++){ 137 contour=(Contour<IssmPDouble>*)domain->GetObjectByOffset(i+1); 138 GridInsideHole(&in.holelist[2*i+0],&in.holelist[2*i+1],contour->nods-1,contour->x,contour->y); 139 } 140 } 141 142 /* Make necessary initializations so that Triangle can return a triangulation in `out': */ 143 out.pointlist = (REAL*)NULL; 144 out.pointattributelist = (REAL*)NULL; 145 out.pointmarkerlist = (int *)NULL; 146 out.trianglelist = (int *)NULL; 147 out.triangleattributelist = (REAL*)NULL; 148 out.neighborlist = (int *)NULL; 149 out.segmentlist = (int *)NULL; 150 out.segmentmarkerlist = (int *)NULL; 151 out.edgelist = (int *)NULL; 152 out.edgemarkerlist = (int *)NULL; 153 154 /* Triangulate the points:. Switches are chosen to read and write a */ 155 /* PSLG (p), preserve the convex hull (c), number everything from */ 156 /* zero (z), assign a regional attribute to each element (A), and */ 157 /* produce an edge list (e), a Voronoi diagram (v), and a triangle */ 158 /* neighbor list (n). */ 159 sprintf(options,"%s%lf","pQzDq30ia",area); /*replace V by Q to quiet down the logging*/ 160 triangulate(options, &in, &out, NULL); 161 /*report(&out, 0, 1, 1, 1, 1, 0);*/ 162 163 /*Allocate index, x and y: */ 164 index=xNew<int>(3*out.numberoftriangles); 165 x=xNew<double>(out.numberofpoints); 166 y=xNew<double>(out.numberofpoints); 167 segments=xNew<int>(3*out.numberofsegments); 168 segmentmarkerlist=xNew<int>(out.numberofsegments); 169 170 for (i = 0; i< out.numberoftriangles; i++) { 171 for (j = 0; j < out.numberofcorners; j++) { 172 index[3*i+j]=(int)out.trianglelist[i*out.numberofcorners+j]+1; 173 } 174 } 175 for (i = 0; i< out.numberofpoints; i++){ 176 x[i]=(double)out.pointlist[i*2+0]; 177 y[i]=(double)out.pointlist[i*2+1]; 178 } 179 for (i = 0; i<out.numberofsegments;i++){ 180 segments[3*i+0]=(int)out.segmentlist[i*2+0]+1; 181 segments[3*i+1]=(int)out.segmentlist[i*2+1]+1; 182 segmentmarkerlist[i]=(int)out.segmentmarkerlist[i]; 183 } 184 185 /*Associate elements with segments: */ 186 AssociateSegmentToElement(&segments,out.numberofsegments,index,out.numberoftriangles); 187 188 /*Order segments so that their normals point outside the domain: */ 189 OrderSegments(&segments,out.numberofsegments, index,out.numberoftriangles); 190 191 /*Output : */ 192 *pindex=index; 193 *px=x; 194 *py=y; 195 *psegments=segments; 196 *psegmentmarkerlist=segmentmarkerlist; 197 *pnels=out.numberoftriangles; 198 *pnods=out.numberofpoints; 199 *pnsegs=out.numberofsegments; 200 #endif 201 } -
../trunk-jpl/src/c/modules/Trianglex
-
../trunk-jpl/src/c/modules/CoordinateSystemTransformx/CoordinateSystemTransformx.cpp
Property changes on: ../trunk-jpl/src/c/modules/Trianglex ___________________________________________________________________ Added: svn:ignore ## -0,0 +1,2 ## +.deps +.dirstamp
1 /*!\file TriMeshx2 * \brief: x code for TriMesh mesher1 /*!\file CoordinateSystemTransformx 2 * \brief: x code for CoordinateSystemTransformx 3 3 */ 4 4 5 5 /*Header files*/ -
../trunk-jpl/src/c/Makefile.am
560 560 modules_sources= ./shared/Threads/LaunchThread.cpp\ 561 561 ./shared/Threads/PartitionRange.cpp\ 562 562 ./shared/Exp/exp.cpp\ 563 ./shared/Tri Mesh/AssociateSegmentToElement.cpp\564 ./shared/Tri Mesh/GridInsideHole.cpp\565 ./shared/Tri Mesh/OrderSegments.cpp\566 ./shared/Tri Mesh/SplitMeshForRifts.cpp\567 ./shared/Tri Mesh/TriMeshUtils.cpp\568 ./modules/Tri Meshx/TriMeshx.cpp\569 ./modules/ TriMeshProcessRiftsx/TriMeshProcessRiftsx.cpp\563 ./shared/Triangle/AssociateSegmentToElement.cpp\ 564 ./shared/Triangle/GridInsideHole.cpp\ 565 ./shared/Triangle/OrderSegments.cpp\ 566 ./shared/Triangle/SplitMeshForRifts.cpp\ 567 ./shared/Triangle/TriangleUtils.cpp\ 568 ./modules/Trianglex/Trianglex.cpp\ 569 ./modules/ProcessRiftsx/ProcessRiftsx.cpp\ 570 570 ./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsx.cpp\ 571 571 ./modules/PointCloudFindNeighborsx/PointCloudFindNeighborsxt.cpp\ 572 572 ./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.cpp\ -
../trunk-jpl/src/c/main/issm.js
10 10 var dbinaryPtr= Module._malloc(nb); var binHeap = new Uint8Array(Module.HEAPU8.buffer,dbinaryPtr,nb); 11 11 binHeap.set(new Uint8Array(dbinary.buffer)); var binary=binHeap.byteOffset; 12 12 13 //Declare TriMeshmodule:13 //Declare module: 14 14 issm= Module.cwrap('main','number',['number','number']); 15 15 16 16 //Call issm: -
../trunk-jpl/src/c/shared/TriMesh/SplitMeshForRifts.cpp
1 /*2 * SplitMeshForRifts.c:3 */4 #include "./trimesh.h"5 #include "../MemOps/MemOps.h"6 7 int SplitMeshForRifts(int* pnel,int** pindex,int* pnods,double** px,double** py,int* pnsegs,int** psegments,int** psegmentmarkerlist){8 9 /*Some notes on dimensions:10 index of size nelx311 x and y of size nodsx112 segments of size nsegsx3*/13 14 int i,j,k,l;15 int node;16 int el;17 int nriftsegs;18 int* riftsegments=NULL;19 int* flags=NULL;20 int NumGridElementListOnOneSideOfRift;21 int* GridElementListOnOneSideOfRift=NULL;22 23 /*Recover input: */24 int nel = *pnel;25 int *index = *pindex;26 int nods = *pnods;27 double *x = *px;28 double *y = *py;29 int nsegs = *pnsegs;30 int *segments = *psegments;31 int *segmentmarkerlist = *psegmentmarkerlist;32 33 /*Establish list of segments that belong to a rift: */34 /*riftsegments of size nriftsegsx4 (4 for first element on segment,second element,first node and second snode)*/35 RiftSegmentsFromSegments(&nriftsegs,&riftsegments,nel,index,nsegs,segments);36 37 /*Go through all nodes of the rift segments, and start splitting the mesh: */38 flags=xNewZeroInit<int>(nods); //to make sure we don't split the same nodes twice!39 for (i=0;i<nriftsegs;i++){40 for (j=0;j<2;j++){41 42 node=riftsegments[4*i+j+2];43 if(flags[node-1]){44 /*This node was already split, skip:*/45 continue;46 }47 else{48 flags[node-1]=1;49 }50 51 if(IsGridOnRift(riftsegments,nriftsegs,node)){52 53 DetermineGridElementListOnOneSideOfRift(&NumGridElementListOnOneSideOfRift,&GridElementListOnOneSideOfRift,i,nriftsegs,riftsegments,node,index,nel);54 55 /*Summary: we have for node, a list of elements56 * (GridElementListOnOneSideOfRift, of size57 * NumGridElementListOnOneSideOfRift) that all contain node58 *and that are on the same side of the rift. For all these59 elements, we clone node into another node, and we swap all60 instances of node in the triangulation *for those elements, to the61 new node.*/62 63 //create new node64 x=xReNew<double>(x,nods,nods+1);65 y=xReNew<double>(y,nods,nods+1);66 x[nods]=x[node-1]; //matlab indexing67 y[nods]=y[node-1]; //matlab indexing68 69 //augment number of nodes70 nods++;71 72 //change elements owning this node73 for (k=0;k<NumGridElementListOnOneSideOfRift;k++){74 el=GridElementListOnOneSideOfRift[k];75 for (l=0;l<3;l++){76 if (index[3*el+l]==node) index[3*el+l]=nods; //again, matlab indexing.77 }78 }79 }// if(IsGridOnRift(riftsegments,nriftsegs,node))80 } //for(j=0;j<2;j++)81 } //for (i=0;i<nriftsegs;i++)82 83 /*update segments: they got modified completely by adding new nodes.*/84 UpdateSegments(&segments,&segmentmarkerlist, &nsegs,index,x,y,riftsegments,nriftsegs,nods,nel);85 86 /*Assign output pointers: */87 *pnel=nel;88 *pindex=index;89 *pnods=nods;90 *px=x;91 *py=y;92 *pnsegs=nsegs;93 *psegments=segments;94 *psegmentmarkerlist=segmentmarkerlist;95 return 1;96 } -
../trunk-jpl/src/c/shared/TriMesh/GridInsideHole.cpp
1 /*2 * GridInsideHole.c:3 * from a convex set of points, figure out a point that for sure lies inside the profile.4 */5 6 #include <math.h>7 8 #include "./trimesh.h"9 #include "../Exp/exp.h"10 11 #undef M_PI12 #define M_PI 3.14159265358979323846264313 14 int GridInsideHole(double* px0,double* py0,int n,double* x,double* y){15 16 double flag=0.0;17 double xA,xB,xC,xD,xE;18 double yA,yB,yC,yD,yE;19 20 /*Take first and last vertices: */21 xA=x[0];22 yA=y[0];23 xB=x[n-1];24 yB=y[n-1];25 26 /*Figure out middle of segment [A B]: */27 xC=(xA+xB)/2;28 yC=(yA+yB)/2;29 30 /*D and E are on each side of segment [A B], on the median line between segment [A B],31 *at an angle of 10 degree (less than the minimum 30 enforced by the quality of the mesh: */32 xD=xC+tan(10./180.*M_PI)*(yC-yA);33 yD=yC+tan(10./180.*M_PI)*(xA-xC);34 xE=xC-tan(10./180.*M_PI)*(yC-yA);35 yE=yC-tan(10./180.*M_PI)*(xA-xC);36 37 /*Either E or D is inside profile (x,y): */38 IsInPolySerial(&flag,&xD,&yD,1,x,y,n,2);39 /*FIXME: used to be 'flag' and not '!flag', check*/40 if(!flag){41 /*D is inside the poly: */42 *px0=xD;43 *py0=yD;44 }45 else{46 /*E is inside the poly: */47 *px0=xE;48 *py0=yE;49 }50 return 1;51 } -
../trunk-jpl/src/c/shared/TriMesh/AssociateSegmentToElement.cpp
1 /*!\file: AssociateSegmentToElement.cpp2 * \brief for each segment, look for the corresponding element.3 */4 5 #include "./trimesh.h"6 7 int AssociateSegmentToElement(int** psegments,int nseg,int* index,int nel){8 9 /*node indices: */10 int A,B;11 12 /*Recover segments: */13 int* segments=*psegments;14 15 for(int i=0;i<nseg;i++){16 A=segments[3*i+0];17 B=segments[3*i+1];18 segments[3*i+2]=FindElement(A,B,index,nel)+1; //matlab indexing.19 }20 21 /*Assign output pointers: */22 *psegments=segments;23 return 1;24 } -
../trunk-jpl/src/c/shared/TriMesh/TriMeshUtils.cpp
1 /*2 * TriMeshUtils: mesh manipulation routines:3 */4 5 #include <stdio.h>6 7 #include "./trimesh.h"8 #include "../Exceptions/exceptions.h"9 #include "../MemOps/MemOps.h"10 11 #define RIFTPENALTYPAIRSWIDTH 812 int IsGridOnRift(int* riftsegments, int nriftsegs, int node){/*{{{*/13 14 /*Does this node belong to 4 elements, or just 2? If it belongs to 4 elements, it is inside a rift,15 *if it belongs to 2 elements, it is on the tip of a rift, or it has already been split across the rift (see below).*/16 17 int i;18 int j;19 int count;20 21 count=0;22 for (i=0;i<nriftsegs;i++){23 for (j=0;j<2;j++){24 if ((*(riftsegments+4*i+2+j))==node) count++;25 }26 }27 if (count==2){28 return 1;29 }30 else{31 return 0;32 }33 }/*}}}*/34 int GridElementsList(int** pGridElements, int* pNumGridElements,int node,int* index,int nel){/*{{{*/35 36 /*From a node, recover all the elements that are connected to it: */37 int i,j;38 int noerr=1;39 40 int max_number_elements=12;41 int current_size;42 int NumGridElements;43 int* GridElements=NULL;44 int* GridElementsRealloc=NULL;45 46 /*From a mesh with 30 degrees minimum angle, we get 12 possible elements that own47 * the node. We start by allocating GridElements with that size, and realloc48 * more if needed.*/49 50 current_size=max_number_elements;51 NumGridElements=0;52 GridElements=xNew<int>(max_number_elements);53 54 for (i=0;i<nel;i++){55 for (j=0;j<3;j++){56 if (index[3*i+j]==node){57 if (NumGridElements<=(current_size-1)){58 GridElements[NumGridElements]=i;59 NumGridElements++;60 break;61 }62 else{63 /*Reallocate another max_number_elements slots in the GridElements: */64 GridElementsRealloc=xReNew<int>(GridElements,current_size,(current_size+max_number_elements));65 if (!GridElementsRealloc){66 noerr=0;67 goto cleanup_and_return;68 }69 current_size+=max_number_elements;70 GridElements=GridElementsRealloc;71 GridElements[NumGridElements]=i;72 NumGridElements++;73 break;74 }75 }76 }77 }78 cleanup_and_return:79 if(!noerr){80 xDelete<int>(GridElements);81 }82 /*Allocate return pointers: */83 *pGridElements=GridElements;84 *pNumGridElements=NumGridElements;85 return noerr;86 }/*}}}*/87 int IsNeighbor(int el1,int el2,int* index){/*{{{*/88 /*From a triangulation held in index, figure out if elements 1 and 2 have two nodes in common: */89 int i,j;90 int count=0;91 for (i=0;i<3;i++){92 for (j=0;j<3;j++){93 if (index[3*el1+i]==index[3*el2+j])count++;94 }95 }96 if (count==2){97 return 1;98 }99 else{100 return 0;101 }102 }/*}}}*/103 int IsOnRift(int el,int nriftsegs,int* riftsegments){/*{{{*/104 /*From a list of elements segments, figure out if el belongs to it: */105 int i;106 for (i=0;i<nriftsegs;i++){107 if ((*(riftsegments+4*i+0)==el) || (*(riftsegments+4*i+1)==el)){108 return 1;109 }110 }111 return 0;112 }/*}}}*/113 void RiftSegmentsFromSegments(int* pnriftsegs, int** priftsegments, int nel,int* index,int nsegs,int* segments){/*{{{*/114 115 int i,counter;116 int el,el2;117 118 int nriftsegs;119 int* riftsegments=NULL;120 int* riftsegments_uncompressed=NULL;121 int element_nodes[3];122 123 /*Allocate segmentflags: */124 riftsegments_uncompressed=xNewZeroInit<int>(nsegs*5);125 126 /*Find the segments that belong to a rift: they are the ones that see two elements. The other ones belong to a boundary127 *or a hole: */128 nriftsegs=0;129 for (i=0;i<nsegs;i++){130 el=(int)*(segments+3*i+2)-1; //element found in AssociateSegmentToElements131 /*Temporarily set nodes belonging to the segments to -1 in the triangulation index, and132 *then proceed to find another element that owns the segment. If we don't find it, we know133 *we are dealing with a boundary or hole, otherwise, we are dealing with a rift: */134 element_nodes[0]=*(index+3*el+0);135 element_nodes[1]=*(index+3*el+1);136 element_nodes[2]=*(index+3*el+2);137 138 index[3*el+0]=-1;139 index[3*el+1]=-1;140 index[3*el+2]=-1;141 142 el2=FindElement(*(segments+3*i+0),*(segments+3*i+1),index,nel);143 144 /*Restore index: */145 index[3*el+0]=element_nodes[0];146 index[3*el+1]=element_nodes[1];147 index[3*el+2]=element_nodes[2];148 149 if (el2!=-1){150 /*el and el2 are on a segment rift, facing one another, plug them into riftsegments_uncompressed: */151 riftsegments_uncompressed[5*i+0]=1;152 riftsegments_uncompressed[5*i+1]=el;153 riftsegments_uncompressed[5*i+2]=el2;154 riftsegments_uncompressed[5*i+3]=segments[3*i+0];155 riftsegments_uncompressed[5*i+4]=segments[3*i+1];156 nriftsegs++;157 }158 }159 160 /*Compress riftsegments_uncompressed:*/161 riftsegments=xNew<int>(nriftsegs*4);162 counter=0;163 for (i=0;i<nsegs;i++){164 if (riftsegments_uncompressed[5*i+0]){165 riftsegments[counter*4+0]=riftsegments_uncompressed[5*i+1];166 riftsegments[counter*4+1]=riftsegments_uncompressed[5*i+2];167 riftsegments[counter*4+2]=riftsegments_uncompressed[5*i+3];168 riftsegments[counter*4+3]=riftsegments_uncompressed[5*i+4];169 counter++;170 }171 }172 xDelete<int>(riftsegments_uncompressed);173 174 /*Assign output pointers: */175 *priftsegments=riftsegments;176 *pnriftsegs=nriftsegs;177 }/*}}}*/178 int DetermineGridElementListOnOneSideOfRift(int* pNumGridElementListOnOneSideOfRift, int** pGridElementListOnOneSideOfRift, int segmentnumber, int nriftsegs, int* riftsegments, int node,int* index,int nel){/*{{{*/179 180 int noerr=1;181 int k,l,counter;182 int newel;183 184 int* GridElements=NULL;185 int NumGridElements;186 187 /*Output: */188 int NumGridElementListOnOneSideOfRift;189 int* GridElementListOnOneSideOfRift=NULL;190 191 /*Build a list of all the elements connected to this node: */192 GridElementsList(&GridElements,&NumGridElements,node,index,nel);193 194 /*Figure out the list of elements that are on the same side of the rift. To do so, we start from one195 * side of the rift and keep rotating in the same direction:*/196 GridElementListOnOneSideOfRift=xNew<int>(NumGridElements);197 //bootstrap the GridElementListOnOneSideOfRift by filling elements from riftsegments: */198 GridElementListOnOneSideOfRift[0]=*(riftsegments+4*segmentnumber+0); /*this one does not belong to the same side, but is just there199 for a rotation direction, we 'll take it out when we are200 done rotating*/201 GridElementListOnOneSideOfRift[1]=*(riftsegments+4*segmentnumber+1);202 counter=1;203 for (;;){204 /*Find neighbour of element GridElementListOnOneSideOfRift[counter], not205 * equal to GridElementListOnOneSideOfRift[counter-1]*/206 for (k=0;k<NumGridElements;k++){207 if(IsNeighbor(GridElements[k],GridElementListOnOneSideOfRift[counter],index)){208 /*Verify this element is not already in our list of element on the same side of the rift: */209 newel=1;210 for (l=0;l<=counter;l++){211 if (GridElements[k]==GridElementListOnOneSideOfRift[l]){212 newel=0;213 break;214 }215 }216 if (newel){217 counter++;218 GridElementListOnOneSideOfRift[counter]=GridElements[k];219 if (IsOnRift(GridElements[k],nriftsegs,riftsegments)){220 break;221 }222 k=-1;223 }224 }225 }226 /*Reduce counter by 1 and get rift of first element in GridElementListOnOneSideOfRift:*/227 NumGridElementListOnOneSideOfRift=counter;228 for (l=0;l<NumGridElementListOnOneSideOfRift;l++){229 GridElementListOnOneSideOfRift[l]=GridElementListOnOneSideOfRift[l+1];230 }231 break;232 }// for (;;)233 234 /*Free ressources: */235 xDelete<int>(GridElements);236 /*Assign output pointers: */237 *pNumGridElementListOnOneSideOfRift=NumGridElementListOnOneSideOfRift;238 *pGridElementListOnOneSideOfRift=GridElementListOnOneSideOfRift;239 return noerr;240 }/*}}}*/241 int UpdateSegments(int** psegments,int** psegmentmarkerlist, int* pnsegs,int* index, double* x,double* y,int* riftsegments,int nriftsegs,int nods,int nel){/*{{{*/242 243 int noerr=1;244 int i,j,k;245 int el1,el2;246 247 int *segments = NULL;248 int *segmentmarkerlist = NULL;249 int nsegs;250 251 /*Recover input: */252 segments = *psegments;253 segmentmarkerlist = *psegmentmarkerlist;254 nsegs = *pnsegs;255 256 /*Reallocate segments: */257 segments =xReNew<int>(segments, nsegs*3,(nsegs+nriftsegs)*3);258 segmentmarkerlist=xReNew<int>(segmentmarkerlist,nsegs,(nsegs+nriftsegs));259 260 /*First, update the existing segments to the new nodes :*/261 for (i=0;i<nriftsegs;i++){262 el1=riftsegments[4*i+0];263 el2=riftsegments[4*i+1];264 for (j=0;j<nsegs;j++){265 if (segments[3*j+2]==(el1+1)){266 /*segment j is the same as rift segment i.Let's update segments[j][:] using element el1 and the corresponding rift segment.267 *Because riftsegments does not represent a list of rift segments anymore (it got heavily modified in SplitElementsForRifts,268 *we can only rely on the position (x,y) of the rift nodes to create a segment:*/269 for (k=0;k<3;k++){270 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+0)-1])){271 *(segments+3*j+0)=*(index+el1*3+k); _assert_(segments[3*j+0]<nods+1);272 break;273 }274 }275 for (k=0;k<3;k++){276 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+1)-1])){277 *(segments+3*j+1)=*(index+el1*3+k); _assert_(segments[3*j+1]<nods+1);278 break;279 }280 }281 /*Deal with el2: */282 *(segments+3*(nsegs+i)+2)=el2+1;283 *(segmentmarkerlist+(nsegs+i))=*(segmentmarkerlist+j);284 for (k=0;k<3;k++){285 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+0)-1])){286 *(segments+3*(nsegs+i)+0)=*(index+el2*3+k); _assert_(segments[3*(nsegs+i)+0]<nods+1);287 break;288 }289 }290 for (k=0;k<3;k++){291 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+1)-1])){292 *(segments+3*(nsegs+i)+1)=*(index+el2*3+k); _assert_(segments[3*(nsegs+i)+1]<nods+1);293 break;294 }295 }296 }297 if (*(segments+3*j+2)==(el2+1)){298 /*segment j is the same as rift segment i.*/299 /*Let's update segments[j][:] using element el2 and the corresponding rift segment: */300 for (k=0;k<3;k++){301 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+0)-1])){302 *(segments+3*j+0)=*(index+el2*3+k); _assert_(segments[3*j+0]<nods+1);303 break;304 }305 }306 for (k=0;k<3;k++){307 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+1)-1])){308 *(segments+3*j+1)=*(index+el2*3+k);_assert_(segments[3*j+1]<nods+1);309 break;310 }311 }312 /*Deal with el1: */313 *(segments+3*(nsegs+i)+2)=el1+1;314 *(segmentmarkerlist+(nsegs+i))=*(segmentmarkerlist+j);315 for (k=0;k<3;k++){316 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+0)-1])){317 *(segments+3*(nsegs+i)+0)=*(index+el1*3+k);_assert_(segments[3*(nsegs+i)+0]<nods+1);318 break;319 }320 }321 for (k=0;k<3;k++){322 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+1)-1])){323 *(segments+3*(nsegs+i)+1)=*(index+el1*3+k);_assert_(segments[3*(nsegs+i)+1]<nods+1);324 break;325 }326 }327 }328 }329 }330 nsegs+=nriftsegs;331 332 /*Assign output pointers: */333 *psegments=segments;334 *psegmentmarkerlist=segmentmarkerlist;335 *pnsegs=nsegs;336 337 return noerr;338 }/*}}}*/339 int FindElement(int A,int B,int* index,int nel){/*{{{*/340 341 int el=-1;342 for (int n=0;n<nel;n++){343 if(((index[3*n+0]==A) || (index[3*n+1]==A) || (index[3*n+2]==A)) && ((index[3*n+0]==B) || (index[3*n+1]==B) || (index[3*n+2]==B))){344 el=n;345 break;346 }347 }348 return el;349 }/*}}}*/350 int SplitRiftSegments(int** psegments,int** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,int*** priftssegments,int numrifts,int nods,int nel){/*{{{*/351 352 /*Using segment markers, wring out the rift segments from the segments. Rift markers are353 *of the form 2+i where i=0 to number of rifts */354 355 int noerr=1;356 int i,j,counter;357 358 /*input: */359 int *segments = NULL;360 int *segmentmarkerlist = NULL;361 int numsegs;362 363 /*output: */364 int new_numsegs;365 int *riftsnumsegs = NULL;366 int **riftssegments = NULL;367 int *new_segments = NULL;368 int *new_segmentmarkers = NULL;369 370 /*intermediary: */371 int* riftsegment=NULL;372 373 /*Recover input arguments: */374 segments = *psegments;375 numsegs = *pnumsegs;376 segmentmarkerlist = *psegmentmarkerlist;377 378 /*First, figure out how many segments will be left in 'segments': */379 counter=0;380 for (i=0;i<numsegs;i++){381 if (segmentmarkerlist[i]==1)counter++; //1 is default marker for non-rifts;382 }383 /*Allocate new segments: */384 new_numsegs=counter;385 new_segments=xNew<int>(new_numsegs*3);386 new_segmentmarkers=xNew<int>(new_numsegs);387 388 /*Copy new segments info : */389 counter=0;390 for (i=0;i<numsegs;i++){391 if (segmentmarkerlist[i]==1){392 new_segments[3*counter+0]=segments[3*i+0];393 new_segments[3*counter+1]=segments[3*i+1];394 new_segments[3*counter+2]=segments[3*i+2];395 new_segmentmarkers[counter]=segmentmarkerlist[i];396 counter++;397 }398 }399 400 /*Now deal with rift segments: */401 riftsnumsegs=xNew<int>(numrifts);402 riftssegments=xNew<int*>(numrifts);403 for (i=0;i<numrifts;i++){404 /*Figure out how many segments for rift i: */405 counter=0;406 for (j=0;j<numsegs;j++){407 if (segmentmarkerlist[j]==2+i)counter++;408 }409 riftsnumsegs[i]=counter;410 riftsegment=xNew<int>(counter*3);411 /*Copy new segments info :*/412 counter=0;413 for (j=0;j<numsegs;j++){414 if (segmentmarkerlist[j]==(2+i)){415 riftsegment[3*counter+0]=segments[3*j+0];_assert_(riftsegment[3*counter+0]<nods+1);416 riftsegment[3*counter+1]=segments[3*j+1];_assert_(riftsegment[3*counter+1]<nods+1);417 riftsegment[3*counter+2]=segments[3*j+2];_assert_(riftsegment[3*counter+2]<nel+1);418 counter++;419 }420 }421 *(riftssegments+i)=riftsegment;422 }423 424 /*Free ressources: */425 xDelete<int>(segments);426 427 /*Assign output pointers: */428 *psegments=new_segments;429 *psegmentmarkerlist=new_segmentmarkers;430 *pnumsegs=new_numsegs;431 *pnumrifts=numrifts;432 *priftssegments=riftssegments;433 *priftsnumsegs=riftsnumsegs;434 return noerr;435 }/*}}}*/436 int PairRiftElements(int** priftsnumpairs,int*** priftspairs,int numrifts,int* riftsnumsegments,int** riftssegments,double* x,double* y){/*{{{*/437 438 int noerr=1;439 int i,j,k;440 441 /*output: */442 int *riftsnumpairs = NULL;443 int **riftspairs = NULL;444 445 /*intermediary :*/446 int numsegs;447 int* segments=NULL;448 int* pairs=NULL;449 int node1,node2,node3,node4;450 451 riftsnumpairs=xNew<int>(numrifts);452 riftspairs=xNew<int*>(numrifts);453 for (i=0;i<numrifts;i++){454 segments=riftssegments[i];455 numsegs =riftsnumsegments[i];456 riftsnumpairs[i]=numsegs;457 pairs=xNew<int>(2*numsegs);458 for (j=0;j<numsegs;j++){459 pairs[2*j+0]=segments[3*j+2]; //retrieve element to which this segment belongs.460 node1=segments[3*j+0]-1; node2=segments[3*j+1]-1;461 /*Find element facing on other side of rift: */462 for (k=0;k<numsegs;k++){463 if (k==j)continue;464 node3=segments[3*k+0]-1; node4=segments[3*k+1]-1;465 /*We are trying to find 2 elements, where position of node3 == position of node1, and position of node4 == position of node2*/466 if ( ((x[node3]==x[node1]) && (y[node3]==y[node1]) && (x[node4]==x[node2]) && (y[node4]==y[node2]))467 || ((x[node3]==x[node2]) && (y[node3]==y[node2]) && (x[node4]==x[node1]) && (y[node4]==y[node1])) ){468 /*We found the corresponding element: */469 pairs[2*j+1]=segments[3*k+2];470 break;471 }472 }473 }474 riftspairs[i]=pairs;475 }476 477 /*Assign output pointers: */478 *priftsnumpairs=riftsnumpairs;479 *priftspairs=riftspairs;480 return noerr;481 }/*}}}*/482 int IsRiftPresent(int* priftflag,int* pnumrifts,int* segmentmarkerlist,int nsegs){/*{{{*/483 484 int i;485 int noerr=1;486 487 /*output: */488 int riftflag=0;489 int numrifts=0;490 491 int maxmark=1; //default marker for regular segments492 493 /*Any marker >=2 indicates a certain rift: */494 numrifts=0;495 for (i=0;i<nsegs;i++){496 if (segmentmarkerlist[i]>maxmark){497 numrifts++;498 maxmark=segmentmarkerlist[i];499 }500 }501 if(numrifts)riftflag=1;502 503 /*Assign output pointers:*/504 *priftflag=riftflag;505 *pnumrifts=numrifts;506 return noerr;507 }/*}}}*/508 int OrderRifts(int** priftstips,int** riftssegments,int** riftspairs,int numrifts,int* riftsnumsegments,double* x,double* y,int nods,int nels){/*{{{*/509 510 int noerr=1;511 int i,j,k,counter;512 513 /*intermediary: */514 int *riftsegments = NULL;515 int *riftpairs = NULL;516 int numsegs;517 518 /*ordering and copy: */519 int *order = NULL;520 int *riftsegments_copy = NULL;521 int *riftpairs_copy = NULL;522 523 /*node and element manipulation: */524 int node1,node2,node3,node4,temp_node,tip1,tip2,node;525 int el2;526 int already_ordered=0;527 528 /*output: */529 int* riftstips=NULL;530 531 /*Allocate byproduct of this routine, riftstips: */532 riftstips=xNew<int>(numrifts*2);533 534 /*Go through all rifts: */535 for (i=0;i<numrifts;i++){536 riftsegments = riftssegments[i];537 riftpairs = riftspairs[i];538 numsegs = riftsnumsegments[i];539 540 /*Allocate copy of riftsegments and riftpairs,541 *as well as ordering vector: */542 riftsegments_copy=xNew<int>(numsegs*3);543 riftpairs_copy=xNew<int>(numsegs*2);544 order=xNew<int>(numsegs);545 546 /*First find the tips, using the pairs. If a pair of elements has one node in common, this node is a rift tip: */547 tip1=-1;548 tip2=-1;549 550 for (j=0;j<numsegs;j++){551 el2=*(riftpairs+2*j+1);552 node1=*(riftsegments+3*j+0);553 node2=*(riftsegments+3*j+1);554 /*Summary, el1 and el2 are facing one another across the rift. node1 and node2 belong to el1 and555 *are located on the rift. Find node3 and node4, nodes belonging to el2 and located on the rift: */556 for (k=0;k<numsegs;k++){557 if (*(riftsegments+3*k+2)==el2){558 node3=*(riftsegments+3*k+0);559 node4=*(riftsegments+3*k+1);560 break;561 }562 }563 /* Make sure node3 faces node1 and node4 faces node2: */564 _assert_(node1<nods+1 && node4<nods+1);565 _assert_(node1>0 && node4>0);566 if ((x[node1-1]==x[node4-1]) && (y[node1-1]==y[node4-1])){567 /*Swap node3 and node4:*/568 temp_node=node3;569 node3=node4;570 node4=temp_node;571 }572 573 /*Figure out if a tip is on this element: */574 if (node3==node1){575 /*node1 is a tip*/576 if (tip1==-1) {577 tip1=node1;578 continue;579 }580 if ((tip2==-1) && (node1!=tip1)){581 tip2=node1;582 break;583 }584 }585 586 if (node4==node2){587 /*node2 is a tip*/588 if (tip1==-1){589 tip1=node2;590 continue;591 }592 if ((tip2==-1) && (node2!=tip1)){593 tip2=node2;594 break;595 }596 }597 }598 599 /*Record tips in riftstips: */600 *(riftstips+2*i+0)=tip1;601 *(riftstips+2*i+1)=tip2;602 603 /*We have the two tips for this rift. Go from tip1 to tip2, and figure out the order in which segments are sequential.604 *Because two elements are connected to tip1, we chose one first, which defines the direction we are rotating along the rift. */605 node=tip1;606 for (counter=0;counter<numsegs;counter++){607 for (j=0;j<numsegs;j++){608 node1=*(riftsegments+3*j+0);609 node2=*(riftsegments+3*j+1);610 611 if ((node1==node) || (node2==node)){612 /*Ok, this segment is connected to node, plug its index into order, unless we already plugged it before: */613 already_ordered=0;614 for (k=0;k<counter;k++){615 if(order[k]==j){616 already_ordered=1;617 break;618 }619 }620 if (!already_ordered){621 order[counter]=j;622 if(node1==node){623 node=node2;624 }625 else if(node2==node){626 node=node1;627 }628 break;629 }630 }631 }632 }633 634 /*Using the order vector, and the riftsegments_copy and riftspairs_copy, reorder the segments and the pairs: */635 for (j=0;j<numsegs;j++){636 _assert_(order[j]<numsegs);637 *(riftsegments_copy+3*j+0)=*(riftsegments+3*order[j]+0);638 *(riftsegments_copy+3*j+1)=*(riftsegments+3*order[j]+1);639 *(riftsegments_copy+3*j+2)=*(riftsegments+3*order[j]+2);640 *(riftpairs_copy+2*j+0)=*(riftpairs+2*order[j]+0);641 *(riftpairs_copy+2*j+1)=*(riftpairs+2*order[j]+1);642 }643 644 for (j=0;j<numsegs;j++){645 *(riftsegments+3*j+0)=*(riftsegments_copy+3*j+0);646 *(riftsegments+3*j+1)=*(riftsegments_copy+3*j+1);647 *(riftsegments+3*j+2)=*(riftsegments_copy+3*j+2);648 *(riftpairs+2*j+0)=*(riftpairs_copy+2*j+0);649 *(riftpairs+2*j+1)=*(riftpairs_copy+2*j+1);650 }651 652 xDelete<int>(order);653 xDelete<int>(riftsegments_copy);654 xDelete<int>(riftpairs_copy);655 656 }657 658 /*Assign output pointer:*/659 *priftstips=riftstips;660 return noerr;661 }/*}}}*/662 int PenaltyPairs(double*** priftspenaltypairs,int** priftsnumpenaltypairs,int numrifts,int** riftssegments,/*{{{*/663 int* riftsnumsegs,int** riftspairs,int* riftstips,double* x,double* y){664 665 int noerr=1;666 int i,j,k,k0;667 668 double el1,el2,node1,node2,node3,node4;669 double temp_node;670 671 /*output: */672 double **riftspenaltypairs = NULL;673 double *riftpenaltypairs = NULL;674 int *riftsnumpenaltypairs = NULL;675 676 /*intermediary: */677 int numsegs;678 int* riftsegments=NULL;679 int* riftpairs=NULL;680 int counter;681 double normal[2];682 double length;683 int k1,k2;684 685 /*Allocate: */686 riftspenaltypairs=xNew<double*>(numrifts);687 riftsnumpenaltypairs=xNew<int>(numrifts);688 689 for(i=0;i<numrifts;i++){690 numsegs=riftsnumsegs[i];691 riftsegments=riftssegments[i];692 riftpairs=riftspairs[i];693 694 /*allocate riftpenaltypairs, and riftnumpenaltypairs: */695 if((numsegs/2-1)!=0)riftpenaltypairs=xNewZeroInit<double>((numsegs/2-1)*RIFTPENALTYPAIRSWIDTH);696 697 /*Go through only one flank of the rifts, not counting the tips: */698 counter=0;699 for(j=0;j<(numsegs/2);j++){700 el1=*(riftpairs+2*j+0);701 el2=*(riftpairs+2*j+1);702 node1=*(riftsegments+3*j+0);703 node2=*(riftsegments+3*j+1);704 /*Find segment index to recover node3 and node4, facing node1 and node2: */705 k0=-1;706 for(k=0;k<numsegs;k++){707 if(*(riftsegments+3*k+2)==el2){708 k0=k;709 break;710 }711 }712 node3=*(riftsegments+3*k0+0);713 node4=*(riftsegments+3*k0+1);714 715 /* Make sure node3 faces node1 and node4 faces node2: */716 if ((x[(int)node1-1]==x[(int)node4-1]) && (y[(int)node1-1]==y[(int)node4-1])){717 /*Swap node3 and node4:*/718 temp_node=node3;719 node3=node4;720 node4=temp_node;721 }722 /*Ok, we have node1 facing node3, and node2 facing node4. Compute the normal to723 *this segment, and its length: */724 normal[0]=cos(atan2(x[(int)node1-1]-x[(int)node2-1],y[(int)node2-1]-y[(int)node1-1]));725 normal[1]=sin(atan2(x[(int)node1-1]-x[(int)node2-1],y[(int)node2-1]-y[(int)node1-1]));726 length=sqrt(pow(x[(int)node2-1]-x[(int)node1-1],(double)2)+pow(y[(int)node2-1]-y[(int)node1-1],(double)2));727 728 /*Be careful here, we want penalty loads on each node, not on each segment. This means we cannot plug node1,729 * node2, node3 and node4 directly into riftpenaltypairs. We need to include node1, node2, node3 and node4,730 * only once. We'll add the normals and the lengths : */731 732 if(node1!=node3){ //exclude tips from loads733 k1=-1;734 for(k=0;k<counter;k++){735 if( (*(riftpenaltypairs+k*7+0))==node1){736 k1=k;737 break;738 }739 }740 if(k1==-1){741 *(riftpenaltypairs+counter*7+0)=node1;742 *(riftpenaltypairs+counter*7+1)=node3;743 *(riftpenaltypairs+counter*7+2)=el1;744 *(riftpenaltypairs+counter*7+3)=el2;745 *(riftpenaltypairs+counter*7+4)=normal[0];746 *(riftpenaltypairs+counter*7+5)=normal[1];747 *(riftpenaltypairs+counter*7+6)=length/2;748 counter++;749 }750 else{751 *(riftpenaltypairs+k1*7+4)+=normal[0];752 *(riftpenaltypairs+k1*7+5)+=normal[1];753 *(riftpenaltypairs+k1*7+6)+=length/2;754 }755 }756 if(node2!=node4){757 k2=-1;758 for(k=0;k<counter;k++){759 if( (*(riftpenaltypairs+k*7+0))==node2){760 k2=k;761 break;762 }763 }764 if(k2==-1){765 *(riftpenaltypairs+counter*7+0)=node2;766 *(riftpenaltypairs+counter*7+1)=node4;767 *(riftpenaltypairs+counter*7+2)=el1;768 *(riftpenaltypairs+counter*7+3)=el2;769 *(riftpenaltypairs+counter*7+4)=normal[0];770 *(riftpenaltypairs+counter*7+5)=normal[1];771 *(riftpenaltypairs+counter*7+6)=length/2;772 counter++;773 }774 else{775 *(riftpenaltypairs+k2*7+4)+=normal[0];776 *(riftpenaltypairs+k2*7+5)+=normal[1];777 *(riftpenaltypairs+k2*7+6)+=length/2;778 }779 }780 }781 /*Renormalize normals: */782 for(j=0;j<counter;j++){783 double magnitude=sqrt(pow( double(riftpenaltypairs[j*7+4]),2) + pow( double(riftpenaltypairs[j*7+5]),2) );784 *(riftpenaltypairs+j*7+4)=*(riftpenaltypairs+j*7+4)/magnitude;785 *(riftpenaltypairs+j*7+5)=*(riftpenaltypairs+j*7+5)/magnitude;786 }787 788 riftspenaltypairs[i]=riftpenaltypairs;789 riftsnumpenaltypairs[i]=(numsegs/2-1);790 }791 792 /*Assign output pointers: */793 *priftspenaltypairs=riftspenaltypairs;794 *priftsnumpenaltypairs=riftsnumpenaltypairs;795 return noerr;796 }/*}}}*/797 int RemoveCornersFromRifts(int** pindex,int* pnel,double** px,double** py,int* pnods,int* segments,int* segmentmarkers,int num_seg){/*{{{*/798 799 int noerr=1;800 int i,j,k;801 int node1,node2,node3;802 int el;803 double pair[2];804 int pair_count=0;805 int triple=0;806 807 /*Recover input: */808 int *index = *pindex;809 int nel = *pnel;810 double *x = *px;811 double *y = *py;812 int nods = *pnods;813 814 for (i=0;i<num_seg;i++){815 node1=*(segments+3*i+0);816 node2=*(segments+3*i+1);817 /*Find all elements connected to [node1 node2]: */818 pair_count=0;819 for (j=0;j<nel;j++){820 if (*(index+3*j+0)==node1){821 if ((*(index+3*j+1)==node2) || (*(index+3*j+2)==node2)){822 pair[pair_count]=j;823 pair_count++;824 }825 }826 if (*(index+3*j+1)==node1){827 if ((*(index+3*j+0)==node2) || (*(index+3*j+2)==node2)){828 pair[pair_count]=j;829 pair_count++;830 }831 }832 if (*(index+3*j+2)==node1){833 if ((*(index+3*j+0)==node2) || (*(index+3*j+1)==node2)){834 pair[pair_count]=j;835 pair_count++;836 }837 }838 }839 /*Ok, we have pair_count elements connected to this segment. For each of these elements,840 *figure out if the third node also belongs to a segment: */841 if ((pair_count==0) || (pair_count==1)){ //we only select the rift segments, which belong to 2 elements842 continue;843 }844 else{845 for (j=0;j<pair_count;j++){846 el=(int)pair[j];847 triple=0;848 /*First find node3: */849 if (*(index+3*el+0)==node1){850 if (*(index+3*el+1)==node2)node3=*(index+3*el+2);851 else node3=*(index+3*el+1);852 }853 if (*(index+3*el+1)==node1){854 if (*(index+3*el+0)==node2)node3=*(index+3*el+2);855 else node3=*(index+3*el+0);856 }857 if (*(index+3*el+2)==node1){858 if (*(index+3*el+0)==node2)node3=*(index+3*el+1);859 else node3=*(index+3*el+0);860 }861 /*Ok, we have node3. Does node3 belong to a segment? : */862 for (k=0;k<num_seg;k++){863 if ((node3==*(segments+3*k+0)) || (node3==*(segments+3*k+1))){864 triple=1;865 break;866 }867 }868 if(triple==1){869 /*el is a corner element: we need to split it in 3 triangles: */870 x=xReNew<double>(x,nods,nods+1);871 y=xReNew<double>(y,nods,nods+1);872 x[nods]=(x[(int)node1-1]+x[(int)node2-1]+x[(int)node3-1])/3;873 y[nods]=(y[(int)node1-1]+y[(int)node2-1]+y[(int)node3-1])/3;874 index=xReNew<int>(index,nel*3,(nel+2*3));875 /*First, reassign element el: */876 *(index+3*el+0)=node1;877 *(index+3*el+1)=node2;878 *(index+3*el+2)=nods+1;879 /*Other two elements: */880 *(index+3*nel+0)=node2;881 *(index+3*nel+1)=node3;882 *(index+3*nel+2)=nods+1;883 884 *(index+3*(nel+1)+0)=node3;885 *(index+3*(nel+1)+1)=node1;886 *(index+3*(nel+1)+2)=nods+1;887 /*we need to change the segment elements corresponding to el: */888 for (k=0;k<num_seg;k++){889 if (*(segments+3*k+2)==(el+1)){890 if ( ((*(segments+3*k+0)==node1) && (*(segments+3*k+1)==node2)) || ((*(segments+3*k+0)==node2) && (*(segments+3*k+1)==node1))) *(segments+3*k+2)=el+1;891 if ( ((*(segments+3*k+0)==node2) && (*(segments+3*k+1)==node3)) || ((*(segments+3*k+0)==node3) && (*(segments+3*k+1)==node2))) *(segments+3*k+2)=nel+1;892 if ( ((*(segments+3*k+0)==node3) && (*(segments+3*k+1)==node1)) || ((*(segments+3*k+0)==node1) && (*(segments+3*k+1)==node3))) *(segments+3*k+2)=nel+2;893 }894 }895 896 nods=nods+1;897 nel=nel+2;898 i=0;899 break;900 }901 } //for (j=0;j<pair_count;j++)902 }903 }// for (i=0;i<num_seg;i++)904 905 /*Assign output pointers: */906 *pindex=index;907 *pnel=nel;908 *px=x;909 *py=y;910 *pnods=nods;911 return noerr;912 }/*}}}*/ -
../trunk-jpl/src/c/shared/TriMesh/trimesh.h
1 /*!\file: trimesh.h2 * \brief3 */4 5 #ifndef _SHARED_TRIMESH_H6 #define _SHARED_TRIMESH_H7 8 #include <stdio.h>9 #include <math.h>10 11 //#define REAL double //took it out because it may conflict with stdlib.h defines. put back if necessary12 int AssociateSegmentToElement(int** psegments,int nseg,int* index,int nel);13 int OrderSegments(int** psegments,int nseg, int* index,int nel);14 int GridInsideHole(double* px0,double* py0,int n,double* x,double* y);15 int FindElement(int A,int B,int* index,int nel);16 int SplitMeshForRifts(int* pnel,int** pindex,int* pnods,double** px,double** py,int* pnsegs,int** psegments,int** psegmentmarkerlist);17 int IsGridOnRift(int* riftsegments, int nriftsegs, int node);18 int GridElementsList(int** pGridElements, int* pNumGridElements,int node,double * index,int nel);19 int IsNeighbor(int el1,int el2,int* index);20 int IsOnRift(int el,int nriftsegs,int* riftsegments);21 void RiftSegmentsFromSegments(int* pnriftsegs, int** priftsegments, int nel,int* index, int nsegs,int* segments);22 int DetermineGridElementListOnOneSideOfRift(int* pNumGridElementListOnOneSideOfRift, int** pGridElementListOnOneSideOfRift,int segmentnumber, int nriftsegs,int* riftsegments, int node,int* index,int nel);23 int UpdateSegments(int** psegments,int** psegmentmarkerlist, int* pnsegs,int* index, double* x,double* y,int* riftsegments,int nriftsegs,int nods,int nel);24 int FindElement(double A,double B,int* index,int nel);25 int IsRiftPresent(int* priftflag,int* pnumrifts,int* segmentmarkerlist,int nsegs);26 int SplitRiftSegments(int** psegments,int** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,int*** priftssegments,int numrifts,int nods,int nels);27 int OrderRifts(int** priftstips,int** riftssegments,int** riftspairs,int numrifts,int* riftsnumsegments,double* x,double* y,int nods,int nels);28 int PenaltyPairs(double*** priftspenaltypairs,int** priftsnumpenaltypairs,int numrifts,int** riftssegments,29 int* riftsnumsegments,int** riftspairs,int* riftstips,double* x,double* y);30 int RemoveCornersFromRifts(int** pindex,int* pnel,double** px,double** py,int* pnods,int* segments,int* segmentmarkers,int num_seg);31 int PairRiftElements(int** priftsnumpairs,int*** priftspairs,int numrifts,int* riftsnumsegments,int** riftssegments,double* x,double* y);32 33 #endif /* _SHARED_TRIMESH_H */ -
../trunk-jpl/src/c/shared/TriMesh/OrderSegments.cpp
1 /*2 * OrderSegments.c:3 * reorder segments so that their normals point outside the domain outline.4 */5 #include "./trimesh.h"6 7 int OrderSegments(int** psegments,int nseg,int* index,int nel){8 9 /*vertex indices: */10 int A,B;11 12 /*element index*/13 int el;14 15 /*Recover segments: */16 int* segments=*psegments;17 18 for(int i=0;i<nseg;i++){19 A=segments[3*i+0];20 B=segments[3*i+1];21 el=segments[3*i+2]-1; //after AssociateSegmentToElement, el was a matlab index, we need the c index now.22 23 if (index[3*el+0]==A){24 if (index[3*el+2]==B){25 segments[3*i+0]=B;26 segments[3*i+1]=A;27 }28 }29 else if (index[3*el+1]==A){30 if (index[3*el+0]==B){31 segments[3*i+0]=B;32 segments[3*i+1]=A;33 }34 }35 else{36 if (index[3*el+1]==B){37 segments[3*i+0]=B;38 segments[3*i+1]=A;39 }40 }41 }42 43 /*Assign output pointers: */44 *psegments=segments;45 return 1;46 } -
../trunk-jpl/src/c/shared/TriMesh
-
../trunk-jpl/src/c/shared/shared.h
Property changes on: ../trunk-jpl/src/c/shared/TriMesh ___________________________________________________________________ Deleted: svn:ignore ## -1,2 +0,0 ## -.deps -.dirstamp
18 18 #include "./Sorting/sorting.h" 19 19 #include "./String/sharedstring.h" 20 20 #include "./Threads/issm_threads.h" 21 #include "./Tri Mesh/trimesh.h"21 #include "./Triangle/triangle.h" 22 22 #include "./LatLong/latlong.h" 23 23 24 24 #endif -
../trunk-jpl/src/c/shared/Triangle/OrderSegments.cpp
1 /* 2 * OrderSegments.c: 3 * reorder segments so that their normals point outside the domain outline. 4 */ 5 #include "./trimesh.h" 6 7 int OrderSegments(int** psegments,int nseg,int* index,int nel){ 8 9 /*vertex indices: */ 10 int A,B; 11 12 /*element index*/ 13 int el; 14 15 /*Recover segments: */ 16 int* segments=*psegments; 17 18 for(int i=0;i<nseg;i++){ 19 A=segments[3*i+0]; 20 B=segments[3*i+1]; 21 el=segments[3*i+2]-1; //after AssociateSegmentToElement, el was a matlab index, we need the c index now. 22 23 if (index[3*el+0]==A){ 24 if (index[3*el+2]==B){ 25 segments[3*i+0]=B; 26 segments[3*i+1]=A; 27 } 28 } 29 else if (index[3*el+1]==A){ 30 if (index[3*el+0]==B){ 31 segments[3*i+0]=B; 32 segments[3*i+1]=A; 33 } 34 } 35 else{ 36 if (index[3*el+1]==B){ 37 segments[3*i+0]=B; 38 segments[3*i+1]=A; 39 } 40 } 41 } 42 43 /*Assign output pointers: */ 44 *psegments=segments; 45 return 1; 46 } -
../trunk-jpl/src/c/shared/Triangle/TriangleUtils.cpp
1 /* 2 * TriangleUtils: mesh manipulation routines: 3 */ 4 5 #include <stdio.h> 6 7 #include "./triangle.h" 8 #include "../Exceptions/exceptions.h" 9 #include "../MemOps/MemOps.h" 10 11 #define RIFTPENALTYPAIRSWIDTH 8 12 int IsGridOnRift(int* riftsegments, int nriftsegs, int node){/*{{{*/ 13 14 /*Does this node belong to 4 elements, or just 2? If it belongs to 4 elements, it is inside a rift, 15 *if it belongs to 2 elements, it is on the tip of a rift, or it has already been split across the rift (see below).*/ 16 17 int i; 18 int j; 19 int count; 20 21 count=0; 22 for (i=0;i<nriftsegs;i++){ 23 for (j=0;j<2;j++){ 24 if ((*(riftsegments+4*i+2+j))==node) count++; 25 } 26 } 27 if (count==2){ 28 return 1; 29 } 30 else{ 31 return 0; 32 } 33 }/*}}}*/ 34 int GridElementsList(int** pGridElements, int* pNumGridElements,int node,int* index,int nel){/*{{{*/ 35 36 /*From a node, recover all the elements that are connected to it: */ 37 int i,j; 38 int noerr=1; 39 40 int max_number_elements=12; 41 int current_size; 42 int NumGridElements; 43 int* GridElements=NULL; 44 int* GridElementsRealloc=NULL; 45 46 /*From a mesh with 30 degrees minimum angle, we get 12 possible elements that own 47 * the node. We start by allocating GridElements with that size, and realloc 48 * more if needed.*/ 49 50 current_size=max_number_elements; 51 NumGridElements=0; 52 GridElements=xNew<int>(max_number_elements); 53 54 for (i=0;i<nel;i++){ 55 for (j=0;j<3;j++){ 56 if (index[3*i+j]==node){ 57 if (NumGridElements<=(current_size-1)){ 58 GridElements[NumGridElements]=i; 59 NumGridElements++; 60 break; 61 } 62 else{ 63 /*Reallocate another max_number_elements slots in the GridElements: */ 64 GridElementsRealloc=xReNew<int>(GridElements,current_size,(current_size+max_number_elements)); 65 if (!GridElementsRealloc){ 66 noerr=0; 67 goto cleanup_and_return; 68 } 69 current_size+=max_number_elements; 70 GridElements=GridElementsRealloc; 71 GridElements[NumGridElements]=i; 72 NumGridElements++; 73 break; 74 } 75 } 76 } 77 } 78 cleanup_and_return: 79 if(!noerr){ 80 xDelete<int>(GridElements); 81 } 82 /*Allocate return pointers: */ 83 *pGridElements=GridElements; 84 *pNumGridElements=NumGridElements; 85 return noerr; 86 }/*}}}*/ 87 int IsNeighbor(int el1,int el2,int* index){/*{{{*/ 88 /*From a triangulation held in index, figure out if elements 1 and 2 have two nodes in common: */ 89 int i,j; 90 int count=0; 91 for (i=0;i<3;i++){ 92 for (j=0;j<3;j++){ 93 if (index[3*el1+i]==index[3*el2+j])count++; 94 } 95 } 96 if (count==2){ 97 return 1; 98 } 99 else{ 100 return 0; 101 } 102 }/*}}}*/ 103 int IsOnRift(int el,int nriftsegs,int* riftsegments){/*{{{*/ 104 /*From a list of elements segments, figure out if el belongs to it: */ 105 int i; 106 for (i=0;i<nriftsegs;i++){ 107 if ((*(riftsegments+4*i+0)==el) || (*(riftsegments+4*i+1)==el)){ 108 return 1; 109 } 110 } 111 return 0; 112 }/*}}}*/ 113 void RiftSegmentsFromSegments(int* pnriftsegs, int** priftsegments, int nel,int* index,int nsegs,int* segments){/*{{{*/ 114 115 int i,counter; 116 int el,el2; 117 118 int nriftsegs; 119 int* riftsegments=NULL; 120 int* riftsegments_uncompressed=NULL; 121 int element_nodes[3]; 122 123 /*Allocate segmentflags: */ 124 riftsegments_uncompressed=xNewZeroInit<int>(nsegs*5); 125 126 /*Find the segments that belong to a rift: they are the ones that see two elements. The other ones belong to a boundary 127 *or a hole: */ 128 nriftsegs=0; 129 for (i=0;i<nsegs;i++){ 130 el=(int)*(segments+3*i+2)-1; //element found in AssociateSegmentToElements 131 /*Temporarily set nodes belonging to the segments to -1 in the triangulation index, and 132 *then proceed to find another element that owns the segment. If we don't find it, we know 133 *we are dealing with a boundary or hole, otherwise, we are dealing with a rift: */ 134 element_nodes[0]=*(index+3*el+0); 135 element_nodes[1]=*(index+3*el+1); 136 element_nodes[2]=*(index+3*el+2); 137 138 index[3*el+0]=-1; 139 index[3*el+1]=-1; 140 index[3*el+2]=-1; 141 142 el2=FindElement(*(segments+3*i+0),*(segments+3*i+1),index,nel); 143 144 /*Restore index: */ 145 index[3*el+0]=element_nodes[0]; 146 index[3*el+1]=element_nodes[1]; 147 index[3*el+2]=element_nodes[2]; 148 149 if (el2!=-1){ 150 /*el and el2 are on a segment rift, facing one another, plug them into riftsegments_uncompressed: */ 151 riftsegments_uncompressed[5*i+0]=1; 152 riftsegments_uncompressed[5*i+1]=el; 153 riftsegments_uncompressed[5*i+2]=el2; 154 riftsegments_uncompressed[5*i+3]=segments[3*i+0]; 155 riftsegments_uncompressed[5*i+4]=segments[3*i+1]; 156 nriftsegs++; 157 } 158 } 159 160 /*Compress riftsegments_uncompressed:*/ 161 riftsegments=xNew<int>(nriftsegs*4); 162 counter=0; 163 for (i=0;i<nsegs;i++){ 164 if (riftsegments_uncompressed[5*i+0]){ 165 riftsegments[counter*4+0]=riftsegments_uncompressed[5*i+1]; 166 riftsegments[counter*4+1]=riftsegments_uncompressed[5*i+2]; 167 riftsegments[counter*4+2]=riftsegments_uncompressed[5*i+3]; 168 riftsegments[counter*4+3]=riftsegments_uncompressed[5*i+4]; 169 counter++; 170 } 171 } 172 xDelete<int>(riftsegments_uncompressed); 173 174 /*Assign output pointers: */ 175 *priftsegments=riftsegments; 176 *pnriftsegs=nriftsegs; 177 }/*}}}*/ 178 int DetermineGridElementListOnOneSideOfRift(int* pNumGridElementListOnOneSideOfRift, int** pGridElementListOnOneSideOfRift, int segmentnumber, int nriftsegs, int* riftsegments, int node,int* index,int nel){/*{{{*/ 179 180 int noerr=1; 181 int k,l,counter; 182 int newel; 183 184 int* GridElements=NULL; 185 int NumGridElements; 186 187 /*Output: */ 188 int NumGridElementListOnOneSideOfRift; 189 int* GridElementListOnOneSideOfRift=NULL; 190 191 /*Build a list of all the elements connected to this node: */ 192 GridElementsList(&GridElements,&NumGridElements,node,index,nel); 193 194 /*Figure out the list of elements that are on the same side of the rift. To do so, we start from one 195 * side of the rift and keep rotating in the same direction:*/ 196 GridElementListOnOneSideOfRift=xNew<int>(NumGridElements); 197 //bootstrap the GridElementListOnOneSideOfRift by filling elements from riftsegments: */ 198 GridElementListOnOneSideOfRift[0]=*(riftsegments+4*segmentnumber+0); /*this one does not belong to the same side, but is just there 199 for a rotation direction, we 'll take it out when we are 200 done rotating*/ 201 GridElementListOnOneSideOfRift[1]=*(riftsegments+4*segmentnumber+1); 202 counter=1; 203 for (;;){ 204 /*Find neighbour of element GridElementListOnOneSideOfRift[counter], not 205 * equal to GridElementListOnOneSideOfRift[counter-1]*/ 206 for (k=0;k<NumGridElements;k++){ 207 if(IsNeighbor(GridElements[k],GridElementListOnOneSideOfRift[counter],index)){ 208 /*Verify this element is not already in our list of element on the same side of the rift: */ 209 newel=1; 210 for (l=0;l<=counter;l++){ 211 if (GridElements[k]==GridElementListOnOneSideOfRift[l]){ 212 newel=0; 213 break; 214 } 215 } 216 if (newel){ 217 counter++; 218 GridElementListOnOneSideOfRift[counter]=GridElements[k]; 219 if (IsOnRift(GridElements[k],nriftsegs,riftsegments)){ 220 break; 221 } 222 k=-1; 223 } 224 } 225 } 226 /*Reduce counter by 1 and get rift of first element in GridElementListOnOneSideOfRift:*/ 227 NumGridElementListOnOneSideOfRift=counter; 228 for (l=0;l<NumGridElementListOnOneSideOfRift;l++){ 229 GridElementListOnOneSideOfRift[l]=GridElementListOnOneSideOfRift[l+1]; 230 } 231 break; 232 }// for (;;) 233 234 /*Free ressources: */ 235 xDelete<int>(GridElements); 236 /*Assign output pointers: */ 237 *pNumGridElementListOnOneSideOfRift=NumGridElementListOnOneSideOfRift; 238 *pGridElementListOnOneSideOfRift=GridElementListOnOneSideOfRift; 239 return noerr; 240 }/*}}}*/ 241 int UpdateSegments(int** psegments,int** psegmentmarkerlist, int* pnsegs,int* index, double* x,double* y,int* riftsegments,int nriftsegs,int nods,int nel){/*{{{*/ 242 243 int noerr=1; 244 int i,j,k; 245 int el1,el2; 246 247 int *segments = NULL; 248 int *segmentmarkerlist = NULL; 249 int nsegs; 250 251 /*Recover input: */ 252 segments = *psegments; 253 segmentmarkerlist = *psegmentmarkerlist; 254 nsegs = *pnsegs; 255 256 /*Reallocate segments: */ 257 segments =xReNew<int>(segments, nsegs*3,(nsegs+nriftsegs)*3); 258 segmentmarkerlist=xReNew<int>(segmentmarkerlist,nsegs,(nsegs+nriftsegs)); 259 260 /*First, update the existing segments to the new nodes :*/ 261 for (i=0;i<nriftsegs;i++){ 262 el1=riftsegments[4*i+0]; 263 el2=riftsegments[4*i+1]; 264 for (j=0;j<nsegs;j++){ 265 if (segments[3*j+2]==(el1+1)){ 266 /*segment j is the same as rift segment i.Let's update segments[j][:] using element el1 and the corresponding rift segment. 267 *Because riftsegments does not represent a list of rift segments anymore (it got heavily modified in SplitElementsForRifts, 268 *we can only rely on the position (x,y) of the rift nodes to create a segment:*/ 269 for (k=0;k<3;k++){ 270 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+0)-1])){ 271 *(segments+3*j+0)=*(index+el1*3+k); _assert_(segments[3*j+0]<nods+1); 272 break; 273 } 274 } 275 for (k=0;k<3;k++){ 276 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+1)-1])){ 277 *(segments+3*j+1)=*(index+el1*3+k); _assert_(segments[3*j+1]<nods+1); 278 break; 279 } 280 } 281 /*Deal with el2: */ 282 *(segments+3*(nsegs+i)+2)=el2+1; 283 *(segmentmarkerlist+(nsegs+i))=*(segmentmarkerlist+j); 284 for (k=0;k<3;k++){ 285 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+0)-1])){ 286 *(segments+3*(nsegs+i)+0)=*(index+el2*3+k); _assert_(segments[3*(nsegs+i)+0]<nods+1); 287 break; 288 } 289 } 290 for (k=0;k<3;k++){ 291 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+1)-1])){ 292 *(segments+3*(nsegs+i)+1)=*(index+el2*3+k); _assert_(segments[3*(nsegs+i)+1]<nods+1); 293 break; 294 } 295 } 296 } 297 if (*(segments+3*j+2)==(el2+1)){ 298 /*segment j is the same as rift segment i.*/ 299 /*Let's update segments[j][:] using element el2 and the corresponding rift segment: */ 300 for (k=0;k<3;k++){ 301 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+0)-1])){ 302 *(segments+3*j+0)=*(index+el2*3+k); _assert_(segments[3*j+0]<nods+1); 303 break; 304 } 305 } 306 for (k=0;k<3;k++){ 307 if ((x[*(index+el2*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el2*3+k)-1]==y[*(segments+3*j+1)-1])){ 308 *(segments+3*j+1)=*(index+el2*3+k);_assert_(segments[3*j+1]<nods+1); 309 break; 310 } 311 } 312 /*Deal with el1: */ 313 *(segments+3*(nsegs+i)+2)=el1+1; 314 *(segmentmarkerlist+(nsegs+i))=*(segmentmarkerlist+j); 315 for (k=0;k<3;k++){ 316 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+0)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+0)-1])){ 317 *(segments+3*(nsegs+i)+0)=*(index+el1*3+k);_assert_(segments[3*(nsegs+i)+0]<nods+1); 318 break; 319 } 320 } 321 for (k=0;k<3;k++){ 322 if ((x[*(index+el1*3+k)-1]==x[*(segments+3*j+1)-1]) && (y[*(index+el1*3+k)-1]==y[*(segments+3*j+1)-1])){ 323 *(segments+3*(nsegs+i)+1)=*(index+el1*3+k);_assert_(segments[3*(nsegs+i)+1]<nods+1); 324 break; 325 } 326 } 327 } 328 } 329 } 330 nsegs+=nriftsegs; 331 332 /*Assign output pointers: */ 333 *psegments=segments; 334 *psegmentmarkerlist=segmentmarkerlist; 335 *pnsegs=nsegs; 336 337 return noerr; 338 }/*}}}*/ 339 int FindElement(int A,int B,int* index,int nel){/*{{{*/ 340 341 int el=-1; 342 for (int n=0;n<nel;n++){ 343 if(((index[3*n+0]==A) || (index[3*n+1]==A) || (index[3*n+2]==A)) && ((index[3*n+0]==B) || (index[3*n+1]==B) || (index[3*n+2]==B))){ 344 el=n; 345 break; 346 } 347 } 348 return el; 349 }/*}}}*/ 350 int SplitRiftSegments(int** psegments,int** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,int*** priftssegments,int numrifts,int nods,int nel){/*{{{*/ 351 352 /*Using segment markers, wring out the rift segments from the segments. Rift markers are 353 *of the form 2+i where i=0 to number of rifts */ 354 355 int noerr=1; 356 int i,j,counter; 357 358 /*input: */ 359 int *segments = NULL; 360 int *segmentmarkerlist = NULL; 361 int numsegs; 362 363 /*output: */ 364 int new_numsegs; 365 int *riftsnumsegs = NULL; 366 int **riftssegments = NULL; 367 int *new_segments = NULL; 368 int *new_segmentmarkers = NULL; 369 370 /*intermediary: */ 371 int* riftsegment=NULL; 372 373 /*Recover input arguments: */ 374 segments = *psegments; 375 numsegs = *pnumsegs; 376 segmentmarkerlist = *psegmentmarkerlist; 377 378 /*First, figure out how many segments will be left in 'segments': */ 379 counter=0; 380 for (i=0;i<numsegs;i++){ 381 if (segmentmarkerlist[i]==1)counter++; //1 is default marker for non-rifts; 382 } 383 /*Allocate new segments: */ 384 new_numsegs=counter; 385 new_segments=xNew<int>(new_numsegs*3); 386 new_segmentmarkers=xNew<int>(new_numsegs); 387 388 /*Copy new segments info : */ 389 counter=0; 390 for (i=0;i<numsegs;i++){ 391 if (segmentmarkerlist[i]==1){ 392 new_segments[3*counter+0]=segments[3*i+0]; 393 new_segments[3*counter+1]=segments[3*i+1]; 394 new_segments[3*counter+2]=segments[3*i+2]; 395 new_segmentmarkers[counter]=segmentmarkerlist[i]; 396 counter++; 397 } 398 } 399 400 /*Now deal with rift segments: */ 401 riftsnumsegs=xNew<int>(numrifts); 402 riftssegments=xNew<int*>(numrifts); 403 for (i=0;i<numrifts;i++){ 404 /*Figure out how many segments for rift i: */ 405 counter=0; 406 for (j=0;j<numsegs;j++){ 407 if (segmentmarkerlist[j]==2+i)counter++; 408 } 409 riftsnumsegs[i]=counter; 410 riftsegment=xNew<int>(counter*3); 411 /*Copy new segments info :*/ 412 counter=0; 413 for (j=0;j<numsegs;j++){ 414 if (segmentmarkerlist[j]==(2+i)){ 415 riftsegment[3*counter+0]=segments[3*j+0];_assert_(riftsegment[3*counter+0]<nods+1); 416 riftsegment[3*counter+1]=segments[3*j+1];_assert_(riftsegment[3*counter+1]<nods+1); 417 riftsegment[3*counter+2]=segments[3*j+2];_assert_(riftsegment[3*counter+2]<nel+1); 418 counter++; 419 } 420 } 421 *(riftssegments+i)=riftsegment; 422 } 423 424 /*Free ressources: */ 425 xDelete<int>(segments); 426 427 /*Assign output pointers: */ 428 *psegments=new_segments; 429 *psegmentmarkerlist=new_segmentmarkers; 430 *pnumsegs=new_numsegs; 431 *pnumrifts=numrifts; 432 *priftssegments=riftssegments; 433 *priftsnumsegs=riftsnumsegs; 434 return noerr; 435 }/*}}}*/ 436 int PairRiftElements(int** priftsnumpairs,int*** priftspairs,int numrifts,int* riftsnumsegments,int** riftssegments,double* x,double* y){/*{{{*/ 437 438 int noerr=1; 439 int i,j,k; 440 441 /*output: */ 442 int *riftsnumpairs = NULL; 443 int **riftspairs = NULL; 444 445 /*intermediary :*/ 446 int numsegs; 447 int* segments=NULL; 448 int* pairs=NULL; 449 int node1,node2,node3,node4; 450 451 riftsnumpairs=xNew<int>(numrifts); 452 riftspairs=xNew<int*>(numrifts); 453 for (i=0;i<numrifts;i++){ 454 segments=riftssegments[i]; 455 numsegs =riftsnumsegments[i]; 456 riftsnumpairs[i]=numsegs; 457 pairs=xNew<int>(2*numsegs); 458 for (j=0;j<numsegs;j++){ 459 pairs[2*j+0]=segments[3*j+2]; //retrieve element to which this segment belongs. 460 node1=segments[3*j+0]-1; node2=segments[3*j+1]-1; 461 /*Find element facing on other side of rift: */ 462 for (k=0;k<numsegs;k++){ 463 if (k==j)continue; 464 node3=segments[3*k+0]-1; node4=segments[3*k+1]-1; 465 /*We are trying to find 2 elements, where position of node3 == position of node1, and position of node4 == position of node2*/ 466 if ( ((x[node3]==x[node1]) && (y[node3]==y[node1]) && (x[node4]==x[node2]) && (y[node4]==y[node2])) 467 || ((x[node3]==x[node2]) && (y[node3]==y[node2]) && (x[node4]==x[node1]) && (y[node4]==y[node1])) ){ 468 /*We found the corresponding element: */ 469 pairs[2*j+1]=segments[3*k+2]; 470 break; 471 } 472 } 473 } 474 riftspairs[i]=pairs; 475 } 476 477 /*Assign output pointers: */ 478 *priftsnumpairs=riftsnumpairs; 479 *priftspairs=riftspairs; 480 return noerr; 481 }/*}}}*/ 482 int IsRiftPresent(int* priftflag,int* pnumrifts,int* segmentmarkerlist,int nsegs){/*{{{*/ 483 484 int i; 485 int noerr=1; 486 487 /*output: */ 488 int riftflag=0; 489 int numrifts=0; 490 491 int maxmark=1; //default marker for regular segments 492 493 /*Any marker >=2 indicates a certain rift: */ 494 numrifts=0; 495 for (i=0;i<nsegs;i++){ 496 if (segmentmarkerlist[i]>maxmark){ 497 numrifts++; 498 maxmark=segmentmarkerlist[i]; 499 } 500 } 501 if(numrifts)riftflag=1; 502 503 /*Assign output pointers:*/ 504 *priftflag=riftflag; 505 *pnumrifts=numrifts; 506 return noerr; 507 }/*}}}*/ 508 int OrderRifts(int** priftstips,int** riftssegments,int** riftspairs,int numrifts,int* riftsnumsegments,double* x,double* y,int nods,int nels){/*{{{*/ 509 510 int noerr=1; 511 int i,j,k,counter; 512 513 /*intermediary: */ 514 int *riftsegments = NULL; 515 int *riftpairs = NULL; 516 int numsegs; 517 518 /*ordering and copy: */ 519 int *order = NULL; 520 int *riftsegments_copy = NULL; 521 int *riftpairs_copy = NULL; 522 523 /*node and element manipulation: */ 524 int node1,node2,node3,node4,temp_node,tip1,tip2,node; 525 int el2; 526 int already_ordered=0; 527 528 /*output: */ 529 int* riftstips=NULL; 530 531 /*Allocate byproduct of this routine, riftstips: */ 532 riftstips=xNew<int>(numrifts*2); 533 534 /*Go through all rifts: */ 535 for (i=0;i<numrifts;i++){ 536 riftsegments = riftssegments[i]; 537 riftpairs = riftspairs[i]; 538 numsegs = riftsnumsegments[i]; 539 540 /*Allocate copy of riftsegments and riftpairs, 541 *as well as ordering vector: */ 542 riftsegments_copy=xNew<int>(numsegs*3); 543 riftpairs_copy=xNew<int>(numsegs*2); 544 order=xNew<int>(numsegs); 545 546 /*First find the tips, using the pairs. If a pair of elements has one node in common, this node is a rift tip: */ 547 tip1=-1; 548 tip2=-1; 549 550 for (j=0;j<numsegs;j++){ 551 el2=*(riftpairs+2*j+1); 552 node1=*(riftsegments+3*j+0); 553 node2=*(riftsegments+3*j+1); 554 /*Summary, el1 and el2 are facing one another across the rift. node1 and node2 belong to el1 and 555 *are located on the rift. Find node3 and node4, nodes belonging to el2 and located on the rift: */ 556 for (k=0;k<numsegs;k++){ 557 if (*(riftsegments+3*k+2)==el2){ 558 node3=*(riftsegments+3*k+0); 559 node4=*(riftsegments+3*k+1); 560 break; 561 } 562 } 563 /* Make sure node3 faces node1 and node4 faces node2: */ 564 _assert_(node1<nods+1 && node4<nods+1); 565 _assert_(node1>0 && node4>0); 566 if ((x[node1-1]==x[node4-1]) && (y[node1-1]==y[node4-1])){ 567 /*Swap node3 and node4:*/ 568 temp_node=node3; 569 node3=node4; 570 node4=temp_node; 571 } 572 573 /*Figure out if a tip is on this element: */ 574 if (node3==node1){ 575 /*node1 is a tip*/ 576 if (tip1==-1) { 577 tip1=node1; 578 continue; 579 } 580 if ((tip2==-1) && (node1!=tip1)){ 581 tip2=node1; 582 break; 583 } 584 } 585 586 if (node4==node2){ 587 /*node2 is a tip*/ 588 if (tip1==-1){ 589 tip1=node2; 590 continue; 591 } 592 if ((tip2==-1) && (node2!=tip1)){ 593 tip2=node2; 594 break; 595 } 596 } 597 } 598 599 /*Record tips in riftstips: */ 600 *(riftstips+2*i+0)=tip1; 601 *(riftstips+2*i+1)=tip2; 602 603 /*We have the two tips for this rift. Go from tip1 to tip2, and figure out the order in which segments are sequential. 604 *Because two elements are connected to tip1, we chose one first, which defines the direction we are rotating along the rift. */ 605 node=tip1; 606 for (counter=0;counter<numsegs;counter++){ 607 for (j=0;j<numsegs;j++){ 608 node1=*(riftsegments+3*j+0); 609 node2=*(riftsegments+3*j+1); 610 611 if ((node1==node) || (node2==node)){ 612 /*Ok, this segment is connected to node, plug its index into order, unless we already plugged it before: */ 613 already_ordered=0; 614 for (k=0;k<counter;k++){ 615 if(order[k]==j){ 616 already_ordered=1; 617 break; 618 } 619 } 620 if (!already_ordered){ 621 order[counter]=j; 622 if(node1==node){ 623 node=node2; 624 } 625 else if(node2==node){ 626 node=node1; 627 } 628 break; 629 } 630 } 631 } 632 } 633 634 /*Using the order vector, and the riftsegments_copy and riftspairs_copy, reorder the segments and the pairs: */ 635 for (j=0;j<numsegs;j++){ 636 _assert_(order[j]<numsegs); 637 *(riftsegments_copy+3*j+0)=*(riftsegments+3*order[j]+0); 638 *(riftsegments_copy+3*j+1)=*(riftsegments+3*order[j]+1); 639 *(riftsegments_copy+3*j+2)=*(riftsegments+3*order[j]+2); 640 *(riftpairs_copy+2*j+0)=*(riftpairs+2*order[j]+0); 641 *(riftpairs_copy+2*j+1)=*(riftpairs+2*order[j]+1); 642 } 643 644 for (j=0;j<numsegs;j++){ 645 *(riftsegments+3*j+0)=*(riftsegments_copy+3*j+0); 646 *(riftsegments+3*j+1)=*(riftsegments_copy+3*j+1); 647 *(riftsegments+3*j+2)=*(riftsegments_copy+3*j+2); 648 *(riftpairs+2*j+0)=*(riftpairs_copy+2*j+0); 649 *(riftpairs+2*j+1)=*(riftpairs_copy+2*j+1); 650 } 651 652 xDelete<int>(order); 653 xDelete<int>(riftsegments_copy); 654 xDelete<int>(riftpairs_copy); 655 656 } 657 658 /*Assign output pointer:*/ 659 *priftstips=riftstips; 660 return noerr; 661 }/*}}}*/ 662 int PenaltyPairs(double*** priftspenaltypairs,int** priftsnumpenaltypairs,int numrifts,int** riftssegments,/*{{{*/ 663 int* riftsnumsegs,int** riftspairs,int* riftstips,double* x,double* y){ 664 665 int noerr=1; 666 int i,j,k,k0; 667 668 double el1,el2,node1,node2,node3,node4; 669 double temp_node; 670 671 /*output: */ 672 double **riftspenaltypairs = NULL; 673 double *riftpenaltypairs = NULL; 674 int *riftsnumpenaltypairs = NULL; 675 676 /*intermediary: */ 677 int numsegs; 678 int* riftsegments=NULL; 679 int* riftpairs=NULL; 680 int counter; 681 double normal[2]; 682 double length; 683 int k1,k2; 684 685 /*Allocate: */ 686 riftspenaltypairs=xNew<double*>(numrifts); 687 riftsnumpenaltypairs=xNew<int>(numrifts); 688 689 for(i=0;i<numrifts;i++){ 690 numsegs=riftsnumsegs[i]; 691 riftsegments=riftssegments[i]; 692 riftpairs=riftspairs[i]; 693 694 /*allocate riftpenaltypairs, and riftnumpenaltypairs: */ 695 if((numsegs/2-1)!=0)riftpenaltypairs=xNewZeroInit<double>((numsegs/2-1)*RIFTPENALTYPAIRSWIDTH); 696 697 /*Go through only one flank of the rifts, not counting the tips: */ 698 counter=0; 699 for(j=0;j<(numsegs/2);j++){ 700 el1=*(riftpairs+2*j+0); 701 el2=*(riftpairs+2*j+1); 702 node1=*(riftsegments+3*j+0); 703 node2=*(riftsegments+3*j+1); 704 /*Find segment index to recover node3 and node4, facing node1 and node2: */ 705 k0=-1; 706 for(k=0;k<numsegs;k++){ 707 if(*(riftsegments+3*k+2)==el2){ 708 k0=k; 709 break; 710 } 711 } 712 node3=*(riftsegments+3*k0+0); 713 node4=*(riftsegments+3*k0+1); 714 715 /* Make sure node3 faces node1 and node4 faces node2: */ 716 if ((x[(int)node1-1]==x[(int)node4-1]) && (y[(int)node1-1]==y[(int)node4-1])){ 717 /*Swap node3 and node4:*/ 718 temp_node=node3; 719 node3=node4; 720 node4=temp_node; 721 } 722 /*Ok, we have node1 facing node3, and node2 facing node4. Compute the normal to 723 *this segment, and its length: */ 724 normal[0]=cos(atan2(x[(int)node1-1]-x[(int)node2-1],y[(int)node2-1]-y[(int)node1-1])); 725 normal[1]=sin(atan2(x[(int)node1-1]-x[(int)node2-1],y[(int)node2-1]-y[(int)node1-1])); 726 length=sqrt(pow(x[(int)node2-1]-x[(int)node1-1],(double)2)+pow(y[(int)node2-1]-y[(int)node1-1],(double)2)); 727 728 /*Be careful here, we want penalty loads on each node, not on each segment. This means we cannot plug node1, 729 * node2, node3 and node4 directly into riftpenaltypairs. We need to include node1, node2, node3 and node4, 730 * only once. We'll add the normals and the lengths : */ 731 732 if(node1!=node3){ //exclude tips from loads 733 k1=-1; 734 for(k=0;k<counter;k++){ 735 if( (*(riftpenaltypairs+k*7+0))==node1){ 736 k1=k; 737 break; 738 } 739 } 740 if(k1==-1){ 741 *(riftpenaltypairs+counter*7+0)=node1; 742 *(riftpenaltypairs+counter*7+1)=node3; 743 *(riftpenaltypairs+counter*7+2)=el1; 744 *(riftpenaltypairs+counter*7+3)=el2; 745 *(riftpenaltypairs+counter*7+4)=normal[0]; 746 *(riftpenaltypairs+counter*7+5)=normal[1]; 747 *(riftpenaltypairs+counter*7+6)=length/2; 748 counter++; 749 } 750 else{ 751 *(riftpenaltypairs+k1*7+4)+=normal[0]; 752 *(riftpenaltypairs+k1*7+5)+=normal[1]; 753 *(riftpenaltypairs+k1*7+6)+=length/2; 754 } 755 } 756 if(node2!=node4){ 757 k2=-1; 758 for(k=0;k<counter;k++){ 759 if( (*(riftpenaltypairs+k*7+0))==node2){ 760 k2=k; 761 break; 762 } 763 } 764 if(k2==-1){ 765 *(riftpenaltypairs+counter*7+0)=node2; 766 *(riftpenaltypairs+counter*7+1)=node4; 767 *(riftpenaltypairs+counter*7+2)=el1; 768 *(riftpenaltypairs+counter*7+3)=el2; 769 *(riftpenaltypairs+counter*7+4)=normal[0]; 770 *(riftpenaltypairs+counter*7+5)=normal[1]; 771 *(riftpenaltypairs+counter*7+6)=length/2; 772 counter++; 773 } 774 else{ 775 *(riftpenaltypairs+k2*7+4)+=normal[0]; 776 *(riftpenaltypairs+k2*7+5)+=normal[1]; 777 *(riftpenaltypairs+k2*7+6)+=length/2; 778 } 779 } 780 } 781 /*Renormalize normals: */ 782 for(j=0;j<counter;j++){ 783 double magnitude=sqrt(pow( double(riftpenaltypairs[j*7+4]),2) + pow( double(riftpenaltypairs[j*7+5]),2) ); 784 *(riftpenaltypairs+j*7+4)=*(riftpenaltypairs+j*7+4)/magnitude; 785 *(riftpenaltypairs+j*7+5)=*(riftpenaltypairs+j*7+5)/magnitude; 786 } 787 788 riftspenaltypairs[i]=riftpenaltypairs; 789 riftsnumpenaltypairs[i]=(numsegs/2-1); 790 } 791 792 /*Assign output pointers: */ 793 *priftspenaltypairs=riftspenaltypairs; 794 *priftsnumpenaltypairs=riftsnumpenaltypairs; 795 return noerr; 796 }/*}}}*/ 797 int RemoveCornersFromRifts(int** pindex,int* pnel,double** px,double** py,int* pnods,int* segments,int* segmentmarkers,int num_seg){/*{{{*/ 798 799 int noerr=1; 800 int i,j,k; 801 int node1,node2,node3; 802 int el; 803 double pair[2]; 804 int pair_count=0; 805 int triple=0; 806 807 /*Recover input: */ 808 int *index = *pindex; 809 int nel = *pnel; 810 double *x = *px; 811 double *y = *py; 812 int nods = *pnods; 813 814 for (i=0;i<num_seg;i++){ 815 node1=*(segments+3*i+0); 816 node2=*(segments+3*i+1); 817 /*Find all elements connected to [node1 node2]: */ 818 pair_count=0; 819 for (j=0;j<nel;j++){ 820 if (*(index+3*j+0)==node1){ 821 if ((*(index+3*j+1)==node2) || (*(index+3*j+2)==node2)){ 822 pair[pair_count]=j; 823 pair_count++; 824 } 825 } 826 if (*(index+3*j+1)==node1){ 827 if ((*(index+3*j+0)==node2) || (*(index+3*j+2)==node2)){ 828 pair[pair_count]=j; 829 pair_count++; 830 } 831 } 832 if (*(index+3*j+2)==node1){ 833 if ((*(index+3*j+0)==node2) || (*(index+3*j+1)==node2)){ 834 pair[pair_count]=j; 835 pair_count++; 836 } 837 } 838 } 839 /*Ok, we have pair_count elements connected to this segment. For each of these elements, 840 *figure out if the third node also belongs to a segment: */ 841 if ((pair_count==0) || (pair_count==1)){ //we only select the rift segments, which belong to 2 elements 842 continue; 843 } 844 else{ 845 for (j=0;j<pair_count;j++){ 846 el=(int)pair[j]; 847 triple=0; 848 /*First find node3: */ 849 if (*(index+3*el+0)==node1){ 850 if (*(index+3*el+1)==node2)node3=*(index+3*el+2); 851 else node3=*(index+3*el+1); 852 } 853 if (*(index+3*el+1)==node1){ 854 if (*(index+3*el+0)==node2)node3=*(index+3*el+2); 855 else node3=*(index+3*el+0); 856 } 857 if (*(index+3*el+2)==node1){ 858 if (*(index+3*el+0)==node2)node3=*(index+3*el+1); 859 else node3=*(index+3*el+0); 860 } 861 /*Ok, we have node3. Does node3 belong to a segment? : */ 862 for (k=0;k<num_seg;k++){ 863 if ((node3==*(segments+3*k+0)) || (node3==*(segments+3*k+1))){ 864 triple=1; 865 break; 866 } 867 } 868 if(triple==1){ 869 /*el is a corner element: we need to split it in 3 triangles: */ 870 x=xReNew<double>(x,nods,nods+1); 871 y=xReNew<double>(y,nods,nods+1); 872 x[nods]=(x[(int)node1-1]+x[(int)node2-1]+x[(int)node3-1])/3; 873 y[nods]=(y[(int)node1-1]+y[(int)node2-1]+y[(int)node3-1])/3; 874 index=xReNew<int>(index,nel*3,(nel+2*3)); 875 /*First, reassign element el: */ 876 *(index+3*el+0)=node1; 877 *(index+3*el+1)=node2; 878 *(index+3*el+2)=nods+1; 879 /*Other two elements: */ 880 *(index+3*nel+0)=node2; 881 *(index+3*nel+1)=node3; 882 *(index+3*nel+2)=nods+1; 883 884 *(index+3*(nel+1)+0)=node3; 885 *(index+3*(nel+1)+1)=node1; 886 *(index+3*(nel+1)+2)=nods+1; 887 /*we need to change the segment elements corresponding to el: */ 888 for (k=0;k<num_seg;k++){ 889 if (*(segments+3*k+2)==(el+1)){ 890 if ( ((*(segments+3*k+0)==node1) && (*(segments+3*k+1)==node2)) || ((*(segments+3*k+0)==node2) && (*(segments+3*k+1)==node1))) *(segments+3*k+2)=el+1; 891 if ( ((*(segments+3*k+0)==node2) && (*(segments+3*k+1)==node3)) || ((*(segments+3*k+0)==node3) && (*(segments+3*k+1)==node2))) *(segments+3*k+2)=nel+1; 892 if ( ((*(segments+3*k+0)==node3) && (*(segments+3*k+1)==node1)) || ((*(segments+3*k+0)==node1) && (*(segments+3*k+1)==node3))) *(segments+3*k+2)=nel+2; 893 } 894 } 895 896 nods=nods+1; 897 nel=nel+2; 898 i=0; 899 break; 900 } 901 } //for (j=0;j<pair_count;j++) 902 } 903 }// for (i=0;i<num_seg;i++) 904 905 /*Assign output pointers: */ 906 *pindex=index; 907 *pnel=nel; 908 *px=x; 909 *py=y; 910 *pnods=nods; 911 return noerr; 912 }/*}}}*/ -
../trunk-jpl/src/c/shared/Triangle/SplitMeshForRifts.cpp
1 /* 2 * SplitMeshForRifts.c: 3 */ 4 #include "./trimesh.h" 5 #include "../MemOps/MemOps.h" 6 7 int SplitMeshForRifts(int* pnel,int** pindex,int* pnods,double** px,double** py,int* pnsegs,int** psegments,int** psegmentmarkerlist){ 8 9 /*Some notes on dimensions: 10 index of size nelx3 11 x and y of size nodsx1 12 segments of size nsegsx3*/ 13 14 int i,j,k,l; 15 int node; 16 int el; 17 int nriftsegs; 18 int* riftsegments=NULL; 19 int* flags=NULL; 20 int NumGridElementListOnOneSideOfRift; 21 int* GridElementListOnOneSideOfRift=NULL; 22 23 /*Recover input: */ 24 int nel = *pnel; 25 int *index = *pindex; 26 int nods = *pnods; 27 double *x = *px; 28 double *y = *py; 29 int nsegs = *pnsegs; 30 int *segments = *psegments; 31 int *segmentmarkerlist = *psegmentmarkerlist; 32 33 /*Establish list of segments that belong to a rift: */ 34 /*riftsegments of size nriftsegsx4 (4 for first element on segment,second element,first node and second snode)*/ 35 RiftSegmentsFromSegments(&nriftsegs,&riftsegments,nel,index,nsegs,segments); 36 37 /*Go through all nodes of the rift segments, and start splitting the mesh: */ 38 flags=xNewZeroInit<int>(nods); //to make sure we don't split the same nodes twice! 39 for (i=0;i<nriftsegs;i++){ 40 for (j=0;j<2;j++){ 41 42 node=riftsegments[4*i+j+2]; 43 if(flags[node-1]){ 44 /*This node was already split, skip:*/ 45 continue; 46 } 47 else{ 48 flags[node-1]=1; 49 } 50 51 if(IsGridOnRift(riftsegments,nriftsegs,node)){ 52 53 DetermineGridElementListOnOneSideOfRift(&NumGridElementListOnOneSideOfRift,&GridElementListOnOneSideOfRift,i,nriftsegs,riftsegments,node,index,nel); 54 55 /*Summary: we have for node, a list of elements 56 * (GridElementListOnOneSideOfRift, of size 57 * NumGridElementListOnOneSideOfRift) that all contain node 58 *and that are on the same side of the rift. For all these 59 elements, we clone node into another node, and we swap all 60 instances of node in the triangulation *for those elements, to the 61 new node.*/ 62 63 //create new node 64 x=xReNew<double>(x,nods,nods+1); 65 y=xReNew<double>(y,nods,nods+1); 66 x[nods]=x[node-1]; //matlab indexing 67 y[nods]=y[node-1]; //matlab indexing 68 69 //augment number of nodes 70 nods++; 71 72 //change elements owning this node 73 for (k=0;k<NumGridElementListOnOneSideOfRift;k++){ 74 el=GridElementListOnOneSideOfRift[k]; 75 for (l=0;l<3;l++){ 76 if (index[3*el+l]==node) index[3*el+l]=nods; //again, matlab indexing. 77 } 78 } 79 }// if(IsGridOnRift(riftsegments,nriftsegs,node)) 80 } //for(j=0;j<2;j++) 81 } //for (i=0;i<nriftsegs;i++) 82 83 /*update segments: they got modified completely by adding new nodes.*/ 84 UpdateSegments(&segments,&segmentmarkerlist, &nsegs,index,x,y,riftsegments,nriftsegs,nods,nel); 85 86 /*Assign output pointers: */ 87 *pnel=nel; 88 *pindex=index; 89 *pnods=nods; 90 *px=x; 91 *py=y; 92 *pnsegs=nsegs; 93 *psegments=segments; 94 *psegmentmarkerlist=segmentmarkerlist; 95 return 1; 96 } -
../trunk-jpl/src/c/shared/Triangle/GridInsideHole.cpp
1 /* 2 * GridInsideHole.c: 3 * from a convex set of points, figure out a point that for sure lies inside the profile. 4 */ 5 6 #include <math.h> 7 8 #include "./trimesh.h" 9 #include "../Exp/exp.h" 10 11 #undef M_PI 12 #define M_PI 3.141592653589793238462643 13 14 int GridInsideHole(double* px0,double* py0,int n,double* x,double* y){ 15 16 double flag=0.0; 17 double xA,xB,xC,xD,xE; 18 double yA,yB,yC,yD,yE; 19 20 /*Take first and last vertices: */ 21 xA=x[0]; 22 yA=y[0]; 23 xB=x[n-1]; 24 yB=y[n-1]; 25 26 /*Figure out middle of segment [A B]: */ 27 xC=(xA+xB)/2; 28 yC=(yA+yB)/2; 29 30 /*D and E are on each side of segment [A B], on the median line between segment [A B], 31 *at an angle of 10 degree (less than the minimum 30 enforced by the quality of the mesh: */ 32 xD=xC+tan(10./180.*M_PI)*(yC-yA); 33 yD=yC+tan(10./180.*M_PI)*(xA-xC); 34 xE=xC-tan(10./180.*M_PI)*(yC-yA); 35 yE=yC-tan(10./180.*M_PI)*(xA-xC); 36 37 /*Either E or D is inside profile (x,y): */ 38 IsInPolySerial(&flag,&xD,&yD,1,x,y,n,2); 39 /*FIXME: used to be 'flag' and not '!flag', check*/ 40 if(!flag){ 41 /*D is inside the poly: */ 42 *px0=xD; 43 *py0=yD; 44 } 45 else{ 46 /*E is inside the poly: */ 47 *px0=xE; 48 *py0=yE; 49 } 50 return 1; 51 } -
../trunk-jpl/src/c/shared/Triangle/triangle.h
1 /*!\file: triangle.h 2 * \brief 3 */ 4 5 #ifndef _SHARED_TRIANGLE_H 6 #define _SHARED_TRIANGLE_H 7 8 #include <stdio.h> 9 #include <math.h> 10 11 //#define REAL double //took it out because it may conflict with stdlib.h defines. put back if necessary 12 int AssociateSegmentToElement(int** psegments,int nseg,int* index,int nel); 13 int OrderSegments(int** psegments,int nseg, int* index,int nel); 14 int GridInsideHole(double* px0,double* py0,int n,double* x,double* y); 15 int FindElement(int A,int B,int* index,int nel); 16 int SplitMeshForRifts(int* pnel,int** pindex,int* pnods,double** px,double** py,int* pnsegs,int** psegments,int** psegmentmarkerlist); 17 int IsGridOnRift(int* riftsegments, int nriftsegs, int node); 18 int GridElementsList(int** pGridElements, int* pNumGridElements,int node,double * index,int nel); 19 int IsNeighbor(int el1,int el2,int* index); 20 int IsOnRift(int el,int nriftsegs,int* riftsegments); 21 void RiftSegmentsFromSegments(int* pnriftsegs, int** priftsegments, int nel,int* index, int nsegs,int* segments); 22 int DetermineGridElementListOnOneSideOfRift(int* pNumGridElementListOnOneSideOfRift, int** pGridElementListOnOneSideOfRift,int segmentnumber, int nriftsegs,int* riftsegments, int node,int* index,int nel); 23 int UpdateSegments(int** psegments,int** psegmentmarkerlist, int* pnsegs,int* index, double* x,double* y,int* riftsegments,int nriftsegs,int nods,int nel); 24 int FindElement(double A,double B,int* index,int nel); 25 int IsRiftPresent(int* priftflag,int* pnumrifts,int* segmentmarkerlist,int nsegs); 26 int SplitRiftSegments(int** psegments,int** psegmentmarkerlist, int* pnumsegs, int* pnumrifts,int** priftsnumsegs,int*** priftssegments,int numrifts,int nods,int nels); 27 int OrderRifts(int** priftstips,int** riftssegments,int** riftspairs,int numrifts,int* riftsnumsegments,double* x,double* y,int nods,int nels); 28 int PenaltyPairs(double*** priftspenaltypairs,int** priftsnumpenaltypairs,int numrifts,int** riftssegments, 29 int* riftsnumsegments,int** riftspairs,int* riftstips,double* x,double* y); 30 int RemoveCornersFromRifts(int** pindex,int* pnel,double** px,double** py,int* pnods,int* segments,int* segmentmarkers,int num_seg); 31 int PairRiftElements(int** priftsnumpairs,int*** priftspairs,int numrifts,int* riftsnumsegments,int** riftssegments,double* x,double* y); 32 33 #endif /* _SHARED_TRIANGLE_H */ -
../trunk-jpl/src/c/shared/Triangle/AssociateSegmentToElement.cpp
1 /*!\file: AssociateSegmentToElement.cpp 2 * \brief for each segment, look for the corresponding element. 3 */ 4 5 #include "./trimesh.h" 6 7 int AssociateSegmentToElement(int** psegments,int nseg,int* index,int nel){ 8 9 /*node indices: */ 10 int A,B; 11 12 /*Recover segments: */ 13 int* segments=*psegments; 14 15 for(int i=0;i<nseg;i++){ 16 A=segments[3*i+0]; 17 B=segments[3*i+1]; 18 segments[3*i+2]=FindElement(A,B,index,nel)+1; //matlab indexing. 19 } 20 21 /*Assign output pointers: */ 22 *psegments=segments; 23 return 1; 24 } -
../trunk-jpl/src/c/shared/Triangle
-
../trunk-jpl/src/wrappers/TriMeshProcessRifts/TriMeshProcessRifts.h
Property changes on: ../trunk-jpl/src/c/shared/Triangle ___________________________________________________________________ Added: svn:ignore ## -0,0 +1,2 ## +.deps +.dirstamp
1 /*2 * TriMeshProcessRifts.h3 */4 5 #ifndef _TRIMESH_PROCESSRIFTS_H_6 #define _TRIMESH_PROCESSRIFTS_H_7 8 #ifdef HAVE_CONFIG_H9 #include <config.h>10 #else11 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"12 #endif13 14 /*For python modules: needs to come before header files inclusion*/15 #ifdef _HAVE_PYTHON_16 #define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol17 #endif18 19 #include "../bindings.h"20 #include "../../c/main/globals.h"21 #include "../../c/modules/modules.h"22 #include "../../c/shared/shared.h"23 24 #undef __FUNCT__25 #define __FUNCT__ "TriMeshProcessRifts"26 27 #ifdef _HAVE_MATLAB_MODULES_28 /* serial input macros: */29 #define INDEXIN prhs[0]30 #define XIN prhs[1]31 #define YIN prhs[2]32 #define SEGMENTSIN prhs[3]33 #define SEGMENTMARKERSIN prhs[4]34 /* serial output macros: */35 #define INDEXOUT (mxArray**)&plhs[0]36 #define XOUT (mxArray**)&plhs[1]37 #define YOUT (mxArray**)&plhs[2]38 #define SEGMENTSOUT (mxArray**)&plhs[3]39 #define SEGMENTMARKERSOUT (mxArray**)&plhs[4]40 #define RIFTSTRUCT (mxArray**)&plhs[5]41 #endif42 43 #ifdef _HAVE_PYTHON_MODULES_44 /* serial input macros: */45 #define INDEXIN PyTuple_GetItem(args,0)46 #define XIN PyTuple_GetItem(args,1)47 #define YIN PyTuple_GetItem(args,2)48 #define SEGMENTSIN PyTuple_GetItem(args,3)49 #define SEGMENTMARKERSIN PyTuple_GetItem(args,4)50 /* serial output macros: */51 #define INDEXOUT output,052 #define XOUT output,153 #define YOUT output,254 #define SEGMENTSOUT output,355 #define SEGMENTMARKERSOUT output,456 #define RIFTSTRUCT output,557 #endif58 59 /* serial arg counts: */60 #undef NLHS61 #define NLHS 662 #undef NRHS63 #define NRHS 564 65 #endif -
../trunk-jpl/src/wrappers/TriMeshProcessRifts/TriMeshProcessRifts.cpp
1 /*!\file: TriMeshProcessRifts.cpp2 * \brief split a mesh where a rift (or fault) is present3 */4 5 #include "./TriMeshProcessRifts.h"6 7 void TriMeshProcessRiftsUsage(void){/*{{{*/8 _printf_("\n");9 _printf_(" usage: [index2,x2,y2,segments2,segmentmarkers2,rifts2]=TriMeshProcessrifts(index1,x1,y1,segments1,segmentmarkers1) \n");10 _printf_(" where: (index1,x1,y1,segments1,segmentmarkers1) is an initial triangulation.\n");11 _printf_(" index2,x2,y2,segments2,segmentmarkers2,rifts2 is the resulting triangulation where rifts have been processed.\n");12 }/*}}}*/13 WRAPPER(TriMeshProcessRifts_python){14 15 /* returned quantities: */16 RiftStruct *riftstruct = NULL;17 18 /* input: */19 int nel,nods;20 int *index = NULL;21 double *x = NULL;22 double *y = NULL;23 int *segments = NULL;24 int *segmentmarkers = NULL;25 int num_seg;26 27 /*Boot module*/28 MODULEBOOT();29 30 /*checks on arguments on the matlab side: */31 CHECKARGUMENTS(NLHS,NRHS,&TriMeshProcessRiftsUsage);32 33 /*Fetch data */34 FetchData(&index,&nel,NULL,INDEXIN);35 FetchData(&x,&nods,XIN);36 FetchData(&y,NULL,YIN);37 FetchData(&segments,&num_seg,NULL,SEGMENTSIN);38 FetchData(&segmentmarkers,NULL,SEGMENTMARKERSIN);39 40 /*call x layer*/41 TriMeshProcessRiftsx(&index,&nel,&x,&y,&nods,&segments,&segmentmarkers,&num_seg,&riftstruct);42 43 /*Output : */44 WriteData(INDEXOUT,index,nel,3);45 WriteData(XOUT,x,nods,1);46 WriteData(YOUT,y,nods,1);47 WriteData(SEGMENTSOUT,segments,num_seg,3);48 WriteData(SEGMENTMARKERSOUT,segmentmarkers,num_seg,1);49 WriteData(RIFTSTRUCT,riftstruct);50 51 /*end module: */52 delete riftstruct;53 xDelete<int>(index);54 xDelete<double>(x);55 xDelete<double>(y);56 xDelete<int>(segments);57 xDelete<int>(segmentmarkers );58 MODULEEND();59 } -
../trunk-jpl/src/wrappers/TriMeshProcessRifts
-
../trunk-jpl/src/wrappers/TriMesh/TriMesh.cpp
Property changes on: ../trunk-jpl/src/wrappers/TriMeshProcessRifts ___________________________________________________________________ Deleted: svn:ignore ## -1,2 +0,0 ## -.deps -.dirstamp
1 /*2 * TriMesh: mesh a domain using an .exp file3 */4 5 #include "./TriMesh.h"6 7 void TriMeshUsage(void){/*{{{*/8 _printf_("\n");9 _printf_(" usage: [index,x,y,segments,segmentmarkers]=TriMesh(domainoutlinefilename,rifts,area) \n");10 _printf_(" where: index,x,y defines a triangulation, segments is an array made \n");11 _printf_(" of exterior segments to the mesh domain outline, segmentmarkers is an array flagging each segment, \n");12 _printf_(" outlinefilename an Argus domain outline file, \n");13 _printf_(" area is the maximum area desired for any element of the resulting mesh, \n");14 _printf_("\n");15 }/*}}}*/16 WRAPPER(TriMesh_python){17 18 /*intermediary: */19 double area;20 Contours *domain = NULL;21 Contours *rifts = NULL;22 23 /* output: */24 int *index = NULL;25 double *x = NULL;26 double *y = NULL;27 int *segments = NULL;28 int *segmentmarkerlist = NULL;29 int nel,nods,nsegs;30 31 /*Boot module: */32 MODULEBOOT();33 34 /*checks on arguments: */35 CHECKARGUMENTS(NLHS,NRHS,&TriMeshUsage);36 37 /*Fetch data needed for meshing: */38 FetchData(&domain,DOMAINOUTLINE);39 FetchData(&rifts,RIFTSOUTLINE);40 FetchData(&area,AREA);41 42 /*call x core: */43 TriMeshx(&index,&x,&y,&segments,&segmentmarkerlist,&nel,&nods,&nsegs,domain,rifts,area);44 45 /*write outputs: */46 WriteData(INDEX,index,nel,3);47 WriteData(X,x,nods);48 WriteData(Y,y,nods);49 WriteData(SEGMENTS,segments,nsegs,3);50 WriteData(SEGMENTMARKERLIST,segmentmarkerlist,nsegs);51 52 /*free ressources: */53 delete domain;54 delete rifts;55 xDelete<int>(index);56 xDelete<double>(x);57 xDelete<double>(y);58 xDelete<int>(segments);59 xDelete<int>(segmentmarkerlist);60 61 /*end module: */62 MODULEEND();63 } -
../trunk-jpl/src/wrappers/TriMesh/TriMesh.h
1 /*2 TriMesh.h3 */4 5 #ifndef _TRIMESH_H6 #define _TRIMESH_H7 8 #ifdef HAVE_CONFIG_H9 #include <config.h>10 #else11 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"12 #endif13 14 /*For python modules: needs to come before header files inclusion*/15 #ifdef _HAVE_PYTHON_16 #define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol17 #endif18 19 #ifdef _HAVE_JAVASCRIPT_MODULES_20 #undef _DO_NOT_LOAD_GLOBALS_ /*only module where this needs to be undefined, so as to21 not include IssmComm several times in the javascript Modle construct.*/22 #endif23 24 /*Header files: */25 #include "../bindings.h"26 #include "../../c/main/globals.h"27 #include "../../c/toolkits/toolkits.h"28 #include "../../c/modules/modules.h"29 #include "../../c/shared/shared.h"30 #include "../../c/shared/io/io.h"31 32 #undef __FUNCT__33 #define __FUNCT__ "TriMesh"34 35 #ifdef _HAVE_MATLAB_MODULES_36 /* serial input macros: */37 #define DOMAINOUTLINE prhs[0]38 #define RIFTSOUTLINE prhs[1]39 #define AREA prhs[2]40 /* serial output macros: */41 #define INDEX (mxArray**)&plhs[0]42 #define X (mxArray**)&plhs[1]43 #define Y (mxArray**)&plhs[2]44 #define SEGMENTS (mxArray**)&plhs[3]45 #define SEGMENTMARKERLIST (mxArray**)&plhs[4]46 #endif47 48 #ifdef _HAVE_PYTHON_MODULES_49 /* serial input macros: */50 #define DOMAINOUTLINE PyTuple_GetItem(args,0)51 #define RIFTSOUTLINE PyTuple_GetItem(args,1)52 #define AREA PyTuple_GetItem(args,2)53 /* serial output macros: */54 #define INDEX output,055 #define X output,156 #define Y output,257 #define SEGMENTS output,358 #define SEGMENTMARKERLIST output,459 #endif60 61 #ifdef _HAVE_JAVASCRIPT_MODULES_62 /* serial input macros: */63 #define DOMAINOUTLINE domainx,domainy,domainnods64 #define RIFTSOUTLINE NULL,NULL,065 #define AREA areain66 /* serial output macros: */67 #define INDEX pindex,pnel68 #define X px,pnods69 #define Y py,pnods70 #define SEGMENTS psegments,pnsegs71 #define SEGMENTMARKERLIST psegmentmarkers,pnsegs72 #define WRAPPER(modulename) extern "C" { int TriMeshModule(double** pindex, double** px, double** py, int* pnel, int* pnods, double** psegments, double** psegmentmarkers, int* pnsegs, double* domainx, double* domainy, int domainnods, double areain)73 #define _DO_NOT_LOAD_GLOBALS_//we only load globals for TriMeshModule.js, not other modules!74 #endif75 76 77 /* serial arg counts: */78 #undef NLHS79 #define NLHS 580 #undef NRHS81 #define NRHS 382 83 #endif /* _TRIMESH_H */ -
../trunk-jpl/src/wrappers/TriMesh/TriMesh.js
1 function TriMesh(md,domain,rifts, area){2 /*TriMesh3 usage: var array = TriMesh(domain,rifts,area);4 where: array is made of [index,x,y,segments,segmentmarkers]5 and index,x,y defines a triangulation, segments is an array made6 of exterior segments to the mesh domain outline, segmentmarkers is an array7 flagging each segment, domain a js array defining the domain outline (sames for8 rifts) and area is the maximum area desired for any element of the resulting mesh.9 10 Ok, for now, we are not dealing with rifts. Also, the domain is made of only one11 profile, this to avoid passing a double** pointer to js.12 */13 14 //Dynamic allocations: {{{15 //Retrieve domain arrays, and allocate on Module heap:16 17 //input18 var dx=new Float64Array(domain['x']); var nx=dx.length * dx.BYTES_PER_ELEMENT;19 var dxPtr= Module._malloc(nx); var domainxHeap = new Uint8Array(Module.HEAPU8.buffer,dxPtr,nx);20 domainxHeap.set(new Uint8Array(dx.buffer)); var domainx=domainxHeap.byteOffset;21 22 var dy=new Float64Array(domain['y']); var ny=dy.length * dy.BYTES_PER_ELEMENT;23 var dyPtr = Module._malloc(ny); var domainyHeap = new Uint8Array(Module.HEAPU8.buffer,dyPtr,ny);24 domainyHeap.set(new Uint8Array(dy.buffer)); var domainy=domainyHeap.byteOffset;25 26 //output27 var nel,indexlinear,index,nods,x,y;28 var pnel= Module._malloc(4);29 var pindex= Module._malloc(4);30 var pnods= Module._malloc(4);31 var px= Module._malloc(4);32 var py= Module._malloc(4);33 var psegments= Module._malloc(4);34 var psegmentmarkers= Module._malloc(4);35 var pnsegs= Module._malloc(4);36 //}}}37 38 //Declare TriMesh module:39 TriMeshModule = Module.cwrap('TriMeshModule','number',['number','number','number','number','number','number','number','number','number','number','number','number']);40 41 //Call TriMesh module:42 TriMeshModule(pindex,px,py,pnel,pnods,psegments,psegmentmarkers,pnsegs, domainx,domainy,dx.length,area);43 44 /*Dynamic copying from heap: {{{*/45 //recover mesh:46 nel = Module.getValue(pnel, 'i32');47 var indexptr = Module.getValue(pindex,'i32');48 indexlinear = Module.HEAPF64.slice(indexptr /8, indexptr/8 + nel*3);49 index = ListToMatrix(indexlinear,3);50 51 nods = Module.getValue(pnods, 'i32');52 var xptr = Module.getValue(px,'i32');53 var yptr = Module.getValue(py,'i32');54 x = Module.HEAPF64.slice(xptr /8, xptr/8 + nods);55 y = Module.HEAPF64.slice(yptr /8, yptr/8 + nods);56 57 nsegs = Module.getValue(pnsegs, 'i32');58 var segmentsptr = Module.getValue(psegments,'i32');59 segmentslinear = Module.HEAPF64.slice(segmentsptr /8, segmentsptr/8 + nsegs*3);60 segments = ListToMatrix(segmentslinear,3);61 62 var segmentmarkersptr = Module.getValue(psegmentmarkers,'i32');63 segmentmarkers = Module.HEAPF64.slice(segmentmarkersptr /8, segmentmarkersptr/8 + nsegs);64 /*}}}*/65 66 var return_array=[index,x,y,segments,segmentmarkers];67 68 /*Free ressources: */69 Module._free(pindex);70 Module._free(indexlinear);71 Module._free(px);72 Module._free(x);73 Module._free(py);74 Module._free(y);75 Module._free(pnel);76 Module._free(pnods);77 Module._free(psegments);78 Module._free(psegmentmarkers);79 Module._free(pnsegs);80 81 return return_array;82 } -
../trunk-jpl/src/wrappers/TriMesh
-
../trunk-jpl/src/wrappers/Triangle/Triangle.js
Property changes on: ../trunk-jpl/src/wrappers/TriMesh ___________________________________________________________________ Deleted: svn:ignore ## -1,2 +0,0 ## -.deps -.dirstamp
1 function Triangle(md,domain,rifts, area){ 2 /*Triangle 3 usage: var array = Triangle(domain,rifts,area); 4 where: array is made of [index,x,y,segments,segmentmarkers] 5 and index,x,y defines a triangulation, segments is an array made 6 of exterior segments to the mesh domain outline, segmentmarkers is an array 7 flagging each segment, domain a js array defining the domain outline (sames for 8 rifts) and area is the maximum area desired for any element of the resulting mesh. 9 10 Ok, for now, we are not dealing with rifts. Also, the domain is made of only one 11 profile, this to avoid passing a double** pointer to js. 12 */ 13 14 //Dynamic allocations: {{{ 15 //Retrieve domain arrays, and allocate on Module heap: 16 17 //input 18 var dx=new Float64Array(domain['x']); var nx=dx.length * dx.BYTES_PER_ELEMENT; 19 var dxPtr= Module._malloc(nx); var domainxHeap = new Uint8Array(Module.HEAPU8.buffer,dxPtr,nx); 20 domainxHeap.set(new Uint8Array(dx.buffer)); var domainx=domainxHeap.byteOffset; 21 22 var dy=new Float64Array(domain['y']); var ny=dy.length * dy.BYTES_PER_ELEMENT; 23 var dyPtr = Module._malloc(ny); var domainyHeap = new Uint8Array(Module.HEAPU8.buffer,dyPtr,ny); 24 domainyHeap.set(new Uint8Array(dy.buffer)); var domainy=domainyHeap.byteOffset; 25 26 //output 27 var nel,indexlinear,index,nods,x,y; 28 var pnel= Module._malloc(4); 29 var pindex= Module._malloc(4); 30 var pnods= Module._malloc(4); 31 var px= Module._malloc(4); 32 var py= Module._malloc(4); 33 var psegments= Module._malloc(4); 34 var psegmentmarkers= Module._malloc(4); 35 var pnsegs= Module._malloc(4); 36 //}}} 37 38 //Declare Triangle module: 39 TriangleModule = Module.cwrap('TriangleModule','number',['number','number','number','number','number','number','number','number','number','number','number','number']); 40 41 //Call Triangle module: 42 TriangleModule(pindex,px,py,pnel,pnods,psegments,psegmentmarkers,pnsegs, domainx,domainy,dx.length,area); 43 44 /*Dynamic copying from heap: {{{*/ 45 //recover mesh: 46 nel = Module.getValue(pnel, 'i32'); 47 var indexptr = Module.getValue(pindex,'i32'); 48 indexlinear = Module.HEAPF64.slice(indexptr /8, indexptr/8 + nel*3); 49 index = ListToMatrix(indexlinear,3); 50 51 nods = Module.getValue(pnods, 'i32'); 52 var xptr = Module.getValue(px,'i32'); 53 var yptr = Module.getValue(py,'i32'); 54 x = Module.HEAPF64.slice(xptr /8, xptr/8 + nods); 55 y = Module.HEAPF64.slice(yptr /8, yptr/8 + nods); 56 57 nsegs = Module.getValue(pnsegs, 'i32'); 58 var segmentsptr = Module.getValue(psegments,'i32'); 59 segmentslinear = Module.HEAPF64.slice(segmentsptr /8, segmentsptr/8 + nsegs*3); 60 segments = ListToMatrix(segmentslinear,3); 61 62 var segmentmarkersptr = Module.getValue(psegmentmarkers,'i32'); 63 segmentmarkers = Module.HEAPF64.slice(segmentmarkersptr /8, segmentmarkersptr/8 + nsegs); 64 /*}}}*/ 65 66 var return_array=[index,x,y,segments,segmentmarkers]; 67 68 /*Free ressources: */ 69 Module._free(pindex); 70 Module._free(indexlinear); 71 Module._free(px); 72 Module._free(x); 73 Module._free(py); 74 Module._free(y); 75 Module._free(pnel); 76 Module._free(pnods); 77 Module._free(psegments); 78 Module._free(psegmentmarkers); 79 Module._free(pnsegs); 80 81 return return_array; 82 } -
../trunk-jpl/src/wrappers/Triangle/Triangle.cpp
1 /* 2 * Triangle: mesh a domain using an .exp file 3 */ 4 5 #include "./Triangle.h" 6 7 void TriangleUsage(void){/*{{{*/ 8 _printf_("\n"); 9 _printf_(" usage: [index,x,y,segments,segmentmarkers]=Triangle(domainoutlinefilename,rifts,area) \n"); 10 _printf_(" where: index,x,y defines a triangulation, segments is an array made \n"); 11 _printf_(" of exterior segments to the mesh domain outline, segmentmarkers is an array flagging each segment, \n"); 12 _printf_(" outlinefilename an Argus domain outline file, \n"); 13 _printf_(" area is the maximum area desired for any element of the resulting mesh, \n"); 14 _printf_("\n"); 15 }/*}}}*/ 16 WRAPPER(Triangle_python){ 17 18 /*intermediary: */ 19 double area; 20 Contours *domain = NULL; 21 Contours *rifts = NULL; 22 23 /* output: */ 24 int *index = NULL; 25 double *x = NULL; 26 double *y = NULL; 27 int *segments = NULL; 28 int *segmentmarkerlist = NULL; 29 int nel,nods,nsegs; 30 31 /*Boot module: */ 32 MODULEBOOT(); 33 34 /*checks on arguments: */ 35 CHECKARGUMENTS(NLHS,NRHS,&TriangleUsage); 36 37 /*Fetch data needed for meshing: */ 38 FetchData(&domain,DOMAINOUTLINE); 39 FetchData(&rifts,RIFTSOUTLINE); 40 FetchData(&area,AREA); 41 42 /*call x core: */ 43 Trianglex(&index,&x,&y,&segments,&segmentmarkerlist,&nel,&nods,&nsegs,domain,rifts,area); 44 45 /*write outputs: */ 46 WriteData(INDEX,index,nel,3); 47 WriteData(X,x,nods); 48 WriteData(Y,y,nods); 49 WriteData(SEGMENTS,segments,nsegs,3); 50 WriteData(SEGMENTMARKERLIST,segmentmarkerlist,nsegs); 51 52 /*free ressources: */ 53 delete domain; 54 delete rifts; 55 xDelete<int>(index); 56 xDelete<double>(x); 57 xDelete<double>(y); 58 xDelete<int>(segments); 59 xDelete<int>(segmentmarkerlist); 60 61 /*end module: */ 62 MODULEEND(); 63 } -
../trunk-jpl/src/wrappers/Triangle/Triangle.h
1 /* 2 Triangle.h 3 */ 4 5 #ifndef _TRIANGLE_H 6 #define _TRIANGLE_H 7 8 #ifdef HAVE_CONFIG_H 9 #include <config.h> 10 #else 11 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" 12 #endif 13 14 /*For python modules: needs to come before header files inclusion*/ 15 #ifdef _HAVE_PYTHON_ 16 #define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol 17 #endif 18 19 #ifdef _HAVE_JAVASCRIPT_MODULES_ 20 #undef _DO_NOT_LOAD_GLOBALS_ /*only module where this needs to be undefined, so as to 21 not include IssmComm several times in the javascript Modle construct.*/ 22 #endif 23 24 /*Header files: */ 25 #include "../bindings.h" 26 #include "../../c/main/globals.h" 27 #include "../../c/toolkits/toolkits.h" 28 #include "../../c/modules/modules.h" 29 #include "../../c/shared/shared.h" 30 #include "../../c/shared/io/io.h" 31 32 #undef __FUNCT__ 33 #define __FUNCT__ "Triangle" 34 35 #ifdef _HAVE_MATLAB_MODULES_ 36 /* serial input macros: */ 37 #define DOMAINOUTLINE prhs[0] 38 #define RIFTSOUTLINE prhs[1] 39 #define AREA prhs[2] 40 /* serial output macros: */ 41 #define INDEX (mxArray**)&plhs[0] 42 #define X (mxArray**)&plhs[1] 43 #define Y (mxArray**)&plhs[2] 44 #define SEGMENTS (mxArray**)&plhs[3] 45 #define SEGMENTMARKERLIST (mxArray**)&plhs[4] 46 #endif 47 48 #ifdef _HAVE_PYTHON_MODULES_ 49 /* serial input macros: */ 50 #define DOMAINOUTLINE PyTuple_GetItem(args,0) 51 #define RIFTSOUTLINE PyTuple_GetItem(args,1) 52 #define AREA PyTuple_GetItem(args,2) 53 /* serial output macros: */ 54 #define INDEX output,0 55 #define X output,1 56 #define Y output,2 57 #define SEGMENTS output,3 58 #define SEGMENTMARKERLIST output,4 59 #endif 60 61 #ifdef _HAVE_JAVASCRIPT_MODULES_ 62 /* serial input macros: */ 63 #define DOMAINOUTLINE domainx,domainy,domainnods 64 #define RIFTSOUTLINE NULL,NULL,0 65 #define AREA areain 66 /* serial output macros: */ 67 #define INDEX pindex,pnel 68 #define X px,pnods 69 #define Y py,pnods 70 #define SEGMENTS psegments,pnsegs 71 #define SEGMENTMARKERLIST psegmentmarkers,pnsegs 72 #define WRAPPER(modulename) extern "C" { int TriangleModule(double** pindex, double** px, double** py, int* pnel, int* pnods, double** psegments, double** psegmentmarkers, int* pnsegs, double* domainx, double* domainy, int domainnods, double areain) 73 #define _DO_NOT_LOAD_GLOBALS_//we only load globals for TriangleModule.js, not other modules! 74 #endif 75 76 77 /* serial arg counts: */ 78 #undef NLHS 79 #define NLHS 5 80 #undef NRHS 81 #define NRHS 3 82 83 #endif /* _TRIANGLE_H */ -
../trunk-jpl/src/wrappers/Triangle
-
../trunk-jpl/src/wrappers/javascript/Makefile.am
Property changes on: ../trunk-jpl/src/wrappers/Triangle ___________________________________________________________________ Added: svn:ignore ## -0,0 +1,2 ## +.deps +.dirstamp
6 6 #define prefix (from http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Defining-Directories.html) 7 7 AM_CPPFLAGS+= -DISSM_PREFIX='"$(prefix)"' 8 8 9 js_scripts = ${ISSM_DIR}/src/wrappers/Tri Mesh/TriMesh.js \9 js_scripts = ${ISSM_DIR}/src/wrappers/Triangle/Triangle.js \ 10 10 ${ISSM_DIR}/src/wrappers/NodeConnectivity/NodeConnectivity.js\ 11 11 ${ISSM_DIR}/src/wrappers/ContourToMesh/ContourToMesh.js\ 12 12 ${ISSM_DIR}/src/wrappers/ElementConnectivity/ElementConnectivity.js\ … … 80 80 libISSMApi_la_LDFLAGS = -static 81 81 endif 82 82 83 IssmModule_SOURCES = ../Tri Mesh/TriMesh.cpp \83 IssmModule_SOURCES = ../Triangle/Triangle.cpp \ 84 84 ../NodeConnectivity/NodeConnectivity.cpp\ 85 85 ../ContourToMesh/ContourToMesh.cpp\ 86 86 ../ElementConnectivity/ElementConnectivity.cpp\ … … 88 88 ../IssmConfig/IssmConfig.cpp\ 89 89 ../Issm/issm.cpp 90 90 91 IssmModule_CXXFLAGS= -fPIC -D_DO_NOT_LOAD_GLOBALS_ --memory-init-file 0 $(AM_CXXFLAGS) $(CXXFLAGS) $(CXXOPTFLAGS) $(COPTFLAGS) -s EXPORTED_FUNCTIONS="['_Tri MeshModule','_NodeConnectivityModule','_ContourToMeshModule','_ElementConnectivityModule','_InterpFromMeshToMesh2dModule','_IssmConfigModule','_IssmModule']" -s DISABLE_EXCEPTION_CATCHING=0 -s ALLOW_MEMORY_GROWTH=1 -s INVOKE_RUN=091 IssmModule_CXXFLAGS= -fPIC -D_DO_NOT_LOAD_GLOBALS_ --memory-init-file 0 $(AM_CXXFLAGS) $(CXXFLAGS) $(CXXOPTFLAGS) $(COPTFLAGS) -s EXPORTED_FUNCTIONS="['_TriangleModule','_NodeConnectivityModule','_ContourToMeshModule','_ElementConnectivityModule','_InterpFromMeshToMesh2dModule','_IssmConfigModule','_IssmModule']" -s DISABLE_EXCEPTION_CATCHING=0 -s ALLOW_MEMORY_GROWTH=1 -s INVOKE_RUN=0 92 92 IssmModule_LDADD = ${deps} $(TRIANGLELIB) $(GSLLIB) 93 93 #}}} -
../trunk-jpl/src/wrappers/ProcessRifts/ProcessRifts.cpp
1 /*!\file: ProcessRifts.cpp 2 * \brief split a mesh where a rift (or fault) is present 3 */ 4 5 #include "./ProcessRifts.h" 6 7 void ProcessRiftsUsage(void){/*{{{*/ 8 _printf_("\n"); 9 _printf_(" usage: [index2,x2,y2,segments2,segmentmarkers2,rifts2]=ProcessRifts(index1,x1,y1,segments1,segmentmarkers1) \n"); 10 _printf_(" where: (index1,x1,y1,segments1,segmentmarkers1) is an initial triangulation.\n"); 11 _printf_(" index2,x2,y2,segments2,segmentmarkers2,rifts2 is the resulting triangulation where rifts have been processed.\n"); 12 }/*}}}*/ 13 WRAPPER(ProcessRifts_python){ 14 15 /* returned quantities: */ 16 RiftStruct *riftstruct = NULL; 17 18 /* input: */ 19 int nel,nods; 20 int *index = NULL; 21 double *x = NULL; 22 double *y = NULL; 23 int *segments = NULL; 24 int *segmentmarkers = NULL; 25 int num_seg; 26 27 /*Boot module*/ 28 MODULEBOOT(); 29 30 /*checks on arguments on the matlab side: */ 31 CHECKARGUMENTS(NLHS,NRHS,&ProcessRiftsUsage); 32 33 /*Fetch data */ 34 FetchData(&index,&nel,NULL,INDEXIN); 35 FetchData(&x,&nods,XIN); 36 FetchData(&y,NULL,YIN); 37 FetchData(&segments,&num_seg,NULL,SEGMENTSIN); 38 FetchData(&segmentmarkers,NULL,SEGMENTMARKERSIN); 39 40 /*call x layer*/ 41 ProcessRiftsx(&index,&nel,&x,&y,&nods,&segments,&segmentmarkers,&num_seg,&riftstruct); 42 43 /*Output : */ 44 WriteData(INDEXOUT,index,nel,3); 45 WriteData(XOUT,x,nods,1); 46 WriteData(YOUT,y,nods,1); 47 WriteData(SEGMENTSOUT,segments,num_seg,3); 48 WriteData(SEGMENTMARKERSOUT,segmentmarkers,num_seg,1); 49 WriteData(RIFTSTRUCT,riftstruct); 50 51 /*end module: */ 52 delete riftstruct; 53 xDelete<int>(index); 54 xDelete<double>(x); 55 xDelete<double>(y); 56 xDelete<int>(segments); 57 xDelete<int>(segmentmarkers ); 58 MODULEEND(); 59 } -
../trunk-jpl/src/wrappers/ProcessRifts/ProcessRifts.h
1 /* 2 * ProcessRifts.h 3 */ 4 5 #ifndef _PROCESSRIFTS_H_ 6 #define _PROCESSRIFTS_H_ 7 8 #ifdef HAVE_CONFIG_H 9 #include <config.h> 10 #else 11 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!" 12 #endif 13 14 /*For python modules: needs to come before header files inclusion*/ 15 #ifdef _HAVE_PYTHON_ 16 #define PY_ARRAY_UNIQUE_SYMBOL PythonIOSymbol 17 #endif 18 19 #include "../bindings.h" 20 #include "../../c/main/globals.h" 21 #include "../../c/modules/modules.h" 22 #include "../../c/shared/shared.h" 23 24 #undef __FUNCT__ 25 #define __FUNCT__ "ProcessRifts" 26 27 #ifdef _HAVE_MATLAB_MODULES_ 28 /* serial input macros: */ 29 #define INDEXIN prhs[0] 30 #define XIN prhs[1] 31 #define YIN prhs[2] 32 #define SEGMENTSIN prhs[3] 33 #define SEGMENTMARKERSIN prhs[4] 34 /* serial output macros: */ 35 #define INDEXOUT (mxArray**)&plhs[0] 36 #define XOUT (mxArray**)&plhs[1] 37 #define YOUT (mxArray**)&plhs[2] 38 #define SEGMENTSOUT (mxArray**)&plhs[3] 39 #define SEGMENTMARKERSOUT (mxArray**)&plhs[4] 40 #define RIFTSTRUCT (mxArray**)&plhs[5] 41 #endif 42 43 #ifdef _HAVE_PYTHON_MODULES_ 44 /* serial input macros: */ 45 #define INDEXIN PyTuple_GetItem(args,0) 46 #define XIN PyTuple_GetItem(args,1) 47 #define YIN PyTuple_GetItem(args,2) 48 #define SEGMENTSIN PyTuple_GetItem(args,3) 49 #define SEGMENTMARKERSIN PyTuple_GetItem(args,4) 50 /* serial output macros: */ 51 #define INDEXOUT output,0 52 #define XOUT output,1 53 #define YOUT output,2 54 #define SEGMENTSOUT output,3 55 #define SEGMENTMARKERSOUT output,4 56 #define RIFTSTRUCT output,5 57 #endif 58 59 /* serial arg counts: */ 60 #undef NLHS 61 #define NLHS 6 62 #undef NRHS 63 #define NRHS 5 64 65 #endif -
../trunk-jpl/src/wrappers/ProcessRifts
-
../trunk-jpl/src/wrappers/matlab/Makefile.am
Property changes on: ../trunk-jpl/src/wrappers/ProcessRifts ___________________________________________________________________ Added: svn:ignore ## -0,0 +1,2 ## +.deps +.dirstamp
57 57 MeshProfileIntersection_matlab.la\ 58 58 PointCloudFindNeighbors_matlab.la\ 59 59 PropagateFlagsFromConnectivity_matlab.la\ 60 Tri Mesh_matlab.la\61 TriMeshProcessRifts_matlab.la\60 Triangle_matlab.la\ 61 ProcessRifts_matlab.la\ 62 62 Scotch_matlab.la 63 63 64 64 if CHACO … … 232 232 ShpRead_matlab_la_CXXFLAGS = ${AM_CXXFLAGS} 233 233 ShpRead_matlab_la_LIBADD = ${deps} $(SHAPELIBLIB) $(PETSCLIB) $(MPILIB) $(NEOPZLIB) $(GSLLIB) $(PROJ4LIB) 234 234 235 Tri Mesh_matlab_la_SOURCES = ../TriMesh/TriMesh.cpp236 Tri Mesh_matlab_la_CXXFLAGS = ${AM_CXXFLAGS}237 Tri Mesh_matlab_la_LIBADD = ${deps} $(PETSCLIB) $(MPILIB) $(TRIANGLELIB) $(NEOPZLIB) $(GSLLIB) $(PROJ4LIB)235 Triangle_matlab_la_SOURCES = ../Triangle/Triangle.cpp 236 Triangle_matlab_la_CXXFLAGS = ${AM_CXXFLAGS} 237 Triangle_matlab_la_LIBADD = ${deps} $(PETSCLIB) $(MPILIB) $(TRIANGLELIB) $(NEOPZLIB) $(GSLLIB) $(PROJ4LIB) 238 238 239 TriMeshProcessRifts_matlab_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp240 TriMeshProcessRifts_matlab_la_CXXFLAGS = ${AM_CXXFLAGS}241 TriMeshProcessRifts_matlab_la_LIBADD = ${deps} $(PETSCLIB) $(MPILIB) $(NEOPZLIB) $(GSLLIB) $(PROJ4LIB)239 ProcessRifts_matlab_la_SOURCES = ../ProcessRifts/ProcessRifts.cpp 240 ProcessRifts_matlab_la_CXXFLAGS = ${AM_CXXFLAGS} 241 ProcessRifts_matlab_la_LIBADD = ${deps} $(PETSCLIB) $(MPILIB) $(NEOPZLIB) $(GSLLIB) $(PROJ4LIB) 242 242 #}}} -
../trunk-jpl/src/wrappers/python/Makefile.am
40 40 IssmConfig_python.la\ 41 41 MeshProfileIntersection_python.la\ 42 42 NodeConnectivity_python.la\ 43 Tri Mesh_python.la\44 TriMeshProcessRifts_python.la43 Triangle_python.la\ 44 ProcessRifts_python.la 45 45 endif 46 46 #}}} 47 47 #Flags and libraries {{{ … … 140 140 NodeConnectivity_python_la_CXXFLAGS = ${AM_CXXFLAGS} 141 141 NodeConnectivity_python_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB) 142 142 143 Tri Mesh_python_la_SOURCES = ../TriMesh/TriMesh.cpp144 Tri Mesh_python_la_CXXFLAGS = ${AM_CXXFLAGS}145 Tri Mesh_python_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB) $(PROJ4LIB)143 Triangle_python_la_SOURCES = ../Triangle/Triangle.cpp 144 Triangle_python_la_CXXFLAGS = ${AM_CXXFLAGS} 145 Triangle_python_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(TRIANGLELIB) $(GSLLIB) $(PROJ4LIB) 146 146 147 TriMeshProcessRifts_python_la_SOURCES = ../TriMeshProcessRifts/TriMeshProcessRifts.cpp148 TriMeshProcessRifts_python_la_CXXFLAGS = ${AM_CXXFLAGS}149 TriMeshProcessRifts_python_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB)147 ProcessRifts_python_la_SOURCES = ../ProcessRifts/ProcessRifts.cpp 148 ProcessRifts_python_la_CXXFLAGS = ${AM_CXXFLAGS} 149 ProcessRifts_python_la_LIBADD = ${deps} $(MPILIB) $(PETSCLIB) $(GSLLIB) $(PROJ4LIB) 150 150 #}}} -
../trunk-jpl/src/m/mesh/triangle.js
1 1 function triangle(md){ 2 2 //TRIANGLE - create model mesh using the triangle package 3 3 // 4 // This routine creates a model mesh using Tri Meshand a domain outline, to within a certain resolution4 // This routine creates a model mesh using Triangle and a domain outline, to within a certain resolution 5 5 // where md is a @model object, domainname is the name of an Argus domain outline file, 6 6 // and resolution is a characteristic length for the mesh (same unit as the domain outline 7 7 // unit). Riftname is an optional argument (Argus domain outline) describing rifts. … … 35 35 var area=Math.pow(resolution,2); 36 36 37 37 //Call mesher: 38 var return_array=Tri Mesh(md, domain, rifts, area);38 var return_array=Triangle(md, domain, rifts, area); 39 39 40 40 //Plug into md: 41 41 md.mesh.elements=return_array[0]; -
../trunk-jpl/src/m/mesh/triangle2dvertical.m
1 1 function md=triangle(md,domainname,resolution) 2 2 %TRIANGLE - create model mesh using the triangle package 3 3 % 4 % This routine creates a model mesh using Tri Meshand a domain outline, to within a certain resolution4 % This routine creates a model mesh using Triangle and a domain outline, to within a certain resolution 5 5 % where md is a @model object, domainname is the name of an Argus domain outline file, 6 6 % and resolution is a characteristic length for the mesh (same unit as the domain outline 7 7 % unit). Riftname is an optional argument (Argus domain outline) describing rifts. … … 23 23 24 24 area=resolution^2; 25 25 26 %Mesh using Tri Mesh27 [elements,x,z,segments,segmentmarkers]=Tri Mesh(domainname,'',area);26 %Mesh using Triangle 27 [elements,x,z,segments,segmentmarkers]=Triangle(domainname,'',area); 28 28 29 29 %check that all the created nodes belong to at least one element 30 30 orphan=find(~ismember([1:length(x)],sort(unique(elements(:))))); -
../trunk-jpl/src/m/mesh/rifts/meshprocessrifts.py
1 1 import numpy as np 2 from TriMeshProcessRifts import TriMeshProcessRifts2 from ProcessRifts import ProcessRifts 3 3 from ContourToMesh import ContourToMesh 4 4 from meshprocessoutsiderifts import meshprocessoutsiderifts 5 5 from GetAreas import GetAreas … … 21 21 """ 22 22 23 23 #Call MEX file 24 md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers,md.rifts.riftstruct= TriMeshProcessRifts(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers)24 md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers,md.rifts.riftstruct=ProcessRifts(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers) 25 25 md.mesh.elements=md.mesh.elements.astype(int) 26 26 md.mesh.x=md.mesh.x.reshape(-1) 27 27 md.mesh.y=md.mesh.y.reshape(-1) … … 28 28 md.mesh.segments=md.mesh.segments.astype(int) 29 29 md.mesh.segmentmarkers=md.mesh.segmentmarkers.astype(int) 30 30 if not isinstance(md.rifts.riftstruct,list) or not md.rifts.riftstruct: 31 raise RuntimeError(" TriMeshProcessRifts did not find any rift")31 raise RuntimeError("ProcessRifts did not find any rift") 32 32 33 33 #Fill in rest of fields: 34 34 numrifts=len(md.rifts.riftstruct) -
../trunk-jpl/src/m/mesh/rifts/meshprocessrifts.m
24 24 end 25 25 26 26 %Call MEX file 27 [md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers,md.rifts.riftstruct]= TriMeshProcessRifts(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers);27 [md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers,md.rifts.riftstruct]=ProcessRifts(md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers); 28 28 if ~isstruct(md.rifts.riftstruct), 29 error(' TriMeshProcessRifts did not find any rift');29 error('ProcessRifts did not find any rift'); 30 30 end 31 31 32 32 %Fill in rest of fields: -
../trunk-jpl/src/m/mesh/argusmesh.m
8 8 % md=argusmesh(md,infile) 9 9 % 10 10 % Example: 11 % md=argusmesh(md,' TriMesh.exp')11 % md=argusmesh(md,'Domain.exp') 12 12 13 13 %some argument check: 14 14 if nargin~=2 | nargout~=1, -
../trunk-jpl/src/m/mesh/triangle.py
1 1 import os.path 2 2 import numpy as np 3 3 from mesh2d import mesh2d 4 from Tri Mesh import TriMesh4 from Triangle import Triangle 5 5 from NodeConnectivity import NodeConnectivity 6 6 from ElementConnectivity import ElementConnectivity 7 7 import MatlabFuncs as m … … 10 10 """ 11 11 TRIANGLE - create model mesh using the triangle package 12 12 13 This routine creates a model mesh using Tri Meshand a domain outline, to within a certain resolution13 This routine creates a model mesh using Triangle and a domain outline, to within a certain resolution 14 14 where md is a @model object, domainname is the name of an Argus domain outline file, 15 15 and resolution is a characteristic length for the mesh (same unit as the domain outline 16 16 unit). Riftname is an optional argument (Argus domain outline) describing rifts. … … 47 47 if not os.path.exists(domainname): 48 48 raise IOError("file '%s' not found" % domainname) 49 49 50 #Mesh using Tri Mesh50 #Mesh using Triangle 51 51 md.mesh=mesh2d() 52 md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers=Tri Mesh(domainname,riftname,area)52 md.mesh.elements,md.mesh.x,md.mesh.y,md.mesh.segments,md.mesh.segmentmarkers=Triangle(domainname,riftname,area) 53 53 md.mesh.elements=md.mesh.elements.astype(int) 54 54 md.mesh.segments=md.mesh.segments.astype(int) 55 55 md.mesh.segmentmarkers=md.mesh.segmentmarkers.astype(int) -
../trunk-jpl/src/m/mesh/triangle.m
1 1 function md=triangle(md,domainname,varargin) 2 2 %TRIANGLE - create model mesh using the triangle package 3 3 % 4 % This routine creates a model mesh using Tri Meshand a domain outline, to within a certain resolution4 % This routine creates a model mesh using Triangle and a domain outline, to within a certain resolution 5 5 % where md is a @model object, domainname is the name of an Argus domain outline file, 6 6 % and resolution is a characteristic length for the mesh (same unit as the domain outline 7 7 % unit). Riftname is an optional argument (Argus domain outline) describing rifts. … … 41 41 error(['file "' domainname '" not found']); 42 42 end 43 43 44 %Mesh using Tri Mesh45 [elements,x,y,segments,segmentmarkers]=Tri Mesh(domainname,riftname,area);44 %Mesh using Triangle 45 [elements,x,y,segments,segmentmarkers]=Triangle(domainname,riftname,area); 46 46 47 47 %check that all the created nodes belong to at least one element 48 48 removeorphans=1; -
../trunk-jpl/src/m/modules/TriMesh.m
1 function [index,x,y,segments,segmentmarkers] = TriMesh(domainoutlinefilename,rifts,mesh_area);2 %TRIMESH - Mesh a domain using an .exp file3 %4 % Usage:5 % [index,x,y,segments,segmentmarkers]=TriMesh(domainoutlinefilename,rifts,mesh_area);6 %7 % index,x,y: Defines a triangulation8 % segments: Array made of exterior segments to the mesh domain outline9 % segmentmarkers: Array flagging each segment10 %11 % domainoutlinefilename: Argus domain outline file12 % mesh_area: Maximum area desired for any element of the resulting mesh13 14 % Check usage15 if nargin~=3 && nargout~=516 help TriMesh17 error('Wrong usage (see above)');18 end19 20 % Call mex module21 [index,x,y,segments,segmentmarkers]=TriMesh_matlab(domainoutlinefilename,rifts,mesh_area); -
../trunk-jpl/src/m/modules/TriMesh.py
1 from TriMesh_python import TriMesh_python2 3 def TriMesh(domainoutlinefilename,rifts,mesh_area):4 """5 TRIMESH - Mesh a domain using an .exp file6 7 Usage:8 [index,x,y,segments,segmentmarkers]=TriMesh(domainoutlinefilename,rifts,mesh_area);9 10 index,x,y: defines a triangulation11 segments: An array made of exterior segments to the mesh domain outline12 segmentmarkers: An array flagging each segment13 14 domainoutlinefilename: an Argus domain outline file15 mesh_area: The maximum area desired for any element of the resulting mesh16 """17 # Call mex module18 index,x,y,segments,segmentmarkers=TriMesh_python(domainoutlinefilename,rifts,mesh_area)19 # Return20 return index,x,y,segments,segmentmarkers21 -
../trunk-jpl/src/m/modules/TriMeshProcessRifts.py
1 from TriMeshProcessRifts_python import TriMeshProcessRifts_python2 3 def TriMeshProcessRifts(index1,x1,y1,segments1,segmentmarkers1):4 """5 TRIMESHPROCESSRIFTS - Split a mesh where a rift (or fault) is present6 7 Usage:8 [index2,x2,y2,segments2,segmentmarkers2,rifts2]=TriMeshProcessRifts(index1,x1,y1,segments1,segmentmarkers1);9 10 (index1,x1,y1,segments1,segmentmarkers1): An initial triangulation.11 [index2,x2,y2,segments2,segmentmarkers2,rifts2]: The resulting triangulation where rifts have been processed.12 """13 # Call mex module14 index2,x2,y2,segments2,segmentmarkers2,rifts2 = TriMeshProcessRifts_python(index1,x1,y1,segments1,segmentmarkers1)15 # Return16 return index2,x2,y2,segments2,segmentmarkers2,rifts2 -
../trunk-jpl/src/m/modules/TriMeshProcessRifts.m
1 function [index2,x2,y2,segments2,segmentmarkers2,rifts2] = TriMeshProcessRifts(index1,x1,y1,segments1,segmentmarkers1);2 %TRIMESHPROCESSRIFTS - Split a mesh where a rift (or fault) is present3 %4 % Usage:5 % [index2,x2,y2,segments2,segmentmarkers2,rifts2]=TriMeshProcessRifts(index1,x1,y1,segments1,segmentmarkers1);6 %7 % (index1,x1,y1,segments1,segmentmarkers1): An initial triangulation.8 % [index2,x2,y2,segments2,segmentmarkers2,rifts2]: The resulting triangulation where rifts have been processed.9 10 % Check usage11 if nargin~=5 && nargout~=612 help TriMeshProcessRifts13 error('Wrong usage (see above)');14 end15 16 % Call mex module17 [index2,x2,y2,segments2,segmentmarkers2,rifts2] = TriMeshProcessRifts_matlab(index1,x1,y1,segments1,segmentmarkers1); -
../trunk-jpl/src/m/modules/ProcessRifts.m
1 function [index2,x2,y2,segments2,segmentmarkers2,rifts2] = ProcessRifts(index1,x1,y1,segments1,segmentmarkers1); 2 %TRIMESHPROCESSRIFTS - Split a mesh where a rift (or fault) is present 3 % 4 % Usage: 5 % [index2,x2,y2,segments2,segmentmarkers2,rifts2]=ProcessRifts(index1,x1,y1,segments1,segmentmarkers1); 6 % 7 % (index1,x1,y1,segments1,segmentmarkers1): An initial triangulation. 8 % [index2,x2,y2,segments2,segmentmarkers2,rifts2]: The resulting triangulation where rifts have been processed. 9 10 % Check usage 11 if nargin~=5 && nargout~=6 12 help ProcessRifts 13 error('Wrong usage (see above)'); 14 end 15 16 % Call mex module 17 [index2,x2,y2,segments2,segmentmarkers2,rifts2] = ProcessRifts_matlab(index1,x1,y1,segments1,segmentmarkers1); -
../trunk-jpl/src/m/modules/Triangle.py
1 from Triangle_python import Triangle_python 2 3 def Triangle(domainoutlinefilename,rifts,mesh_area): 4 """ 5 TRIMESH - Mesh a domain using an .exp file 6 7 Usage: 8 [index,x,y,segments,segmentmarkers]=Triangle(domainoutlinefilename,rifts,mesh_area); 9 10 index,x,y: defines a triangulation 11 segments: An array made of exterior segments to the mesh domain outline 12 segmentmarkers: An array flagging each segment 13 14 domainoutlinefilename: an Argus domain outline file 15 mesh_area: The maximum area desired for any element of the resulting mesh 16 """ 17 # Call mex module 18 index,x,y,segments,segmentmarkers=Triangle_python(domainoutlinefilename,rifts,mesh_area) 19 # Return 20 return index,x,y,segments,segmentmarkers 21 -
../trunk-jpl/src/m/modules/Triangle.m
1 function [index,x,y,segments,segmentmarkers] = Triangle(domainoutlinefilename,rifts,mesh_area); 2 %TRIMESH - Mesh a domain using an .exp file 3 % 4 % Usage: 5 % [index,x,y,segments,segmentmarkers]=Triangle(domainoutlinefilename,rifts,mesh_area); 6 % 7 % index,x,y: Defines a triangulation 8 % segments: Array made of exterior segments to the mesh domain outline 9 % segmentmarkers: Array flagging each segment 10 % 11 % domainoutlinefilename: Argus domain outline file 12 % mesh_area: Maximum area desired for any element of the resulting mesh 13 14 % Check usage 15 if nargin~=3 && nargout~=5 16 help Triangle 17 error('Wrong usage (see above)'); 18 end 19 20 % Call mex module 21 [index,x,y,segments,segmentmarkers]=Triangle_matlab(domainoutlinefilename,rifts,mesh_area); -
../trunk-jpl/src/m/modules/ProcessRifts.py
1 from ProcessRifts_python import ProcessRifts_python 2 3 def ProcessRifts(index1,x1,y1,segments1,segmentmarkers1): 4 """ 5 TRIMESHPROCESSRIFTS - Split a mesh where a rift (or fault) is present 6 7 Usage: 8 [index2,x2,y2,segments2,segmentmarkers2,rifts2]=ProcessRifts(index1,x1,y1,segments1,segmentmarkers1); 9 10 (index1,x1,y1,segments1,segmentmarkers1): An initial triangulation. 11 [index2,x2,y2,segments2,segmentmarkers2,rifts2]: The resulting triangulation where rifts have been processed. 12 """ 13 # Call mex module 14 index2,x2,y2,segments2,segmentmarkers2,rifts2 = ProcessRifts_python(index1,x1,y1,segments1,segmentmarkers1) 15 # Return 16 return index2,x2,y2,segments2,segmentmarkers2,rifts2
Note:
See TracBrowser
for help on using the repository browser.