8 #include "../Exceptions/exceptions.h"
9 #include "../MemOps/MemOps.h"
11 #define RIFTPENALTYPAIRSWIDTH 8
22 for (i=0;i<nriftsegs;i++){
24 if ((*(riftsegments+4*i+2+j))==node) count++;
34 int GridElementsList(
int** pGridElements,
int* pNumGridElements,
int node,
int* index,
int nel){
40 int max_number_elements=12;
43 int* GridElements=NULL;
44 int* GridElementsRealloc=NULL;
50 current_size=max_number_elements;
52 GridElements=xNew<int>(max_number_elements);
56 if (index[3*i+j]==node){
57 if (NumGridElements<=(current_size-1)){
58 GridElements[NumGridElements]=i;
64 GridElementsRealloc=xReNew<int>(GridElements,current_size,(current_size+max_number_elements));
65 if (!GridElementsRealloc){
67 goto cleanup_and_return;
69 current_size+=max_number_elements;
70 GridElements=GridElementsRealloc;
71 GridElements[NumGridElements]=i;
80 xDelete<int>(GridElements);
83 *pGridElements=GridElements;
84 *pNumGridElements=NumGridElements;
93 if (index[3*el1+i]==index[3*el2+j])count++;
103 int IsOnRift(
int el,
int nriftsegs,
int* riftsegments){
106 for (i=0;i<nriftsegs;i++){
107 if ((*(riftsegments+4*i+0)==el) || (*(riftsegments+4*i+1)==el)){
119 int* riftsegments=NULL;
120 int* riftsegments_uncompressed=NULL;
121 int element_nodes[3];
124 riftsegments_uncompressed=xNewZeroInit<int>(nsegs*5);
129 for (i=0;i<nsegs;i++){
130 el=(int)*(segments+3*i+2)-1;
134 element_nodes[0]=*(index+3*el+0);
135 element_nodes[1]=*(index+3*el+1);
136 element_nodes[2]=*(index+3*el+2);
142 el2=
FindElement(*(segments+3*i+0),*(segments+3*i+1),index,nel);
145 index[3*el+0]=element_nodes[0];
146 index[3*el+1]=element_nodes[1];
147 index[3*el+2]=element_nodes[2];
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];
161 riftsegments=xNew<int>(nriftsegs*4);
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];
172 xDelete<int>(riftsegments_uncompressed);
175 *priftsegments=riftsegments;
176 *pnriftsegs=nriftsegs;
178 int DetermineGridElementListOnOneSideOfRift(
int* pNumGridElementListOnOneSideOfRift,
int** pGridElementListOnOneSideOfRift,
int segmentnumber,
int nriftsegs,
int* riftsegments,
int node,
int* index,
int nel){
184 int* GridElements=NULL;
188 int NumGridElementListOnOneSideOfRift;
189 int* GridElementListOnOneSideOfRift=NULL;
196 GridElementListOnOneSideOfRift=xNew<int>(NumGridElements);
198 GridElementListOnOneSideOfRift[0]=*(riftsegments+4*segmentnumber+0);
201 GridElementListOnOneSideOfRift[1]=*(riftsegments+4*segmentnumber+1);
206 for (k=0;k<NumGridElements;k++){
207 if(
IsNeighbor(GridElements[k],GridElementListOnOneSideOfRift[counter],index)){
210 for (l=0;l<=counter;l++){
211 if (GridElements[k]==GridElementListOnOneSideOfRift[l]){
218 GridElementListOnOneSideOfRift[counter]=GridElements[k];
219 if (
IsOnRift(GridElements[k],nriftsegs,riftsegments)){
227 NumGridElementListOnOneSideOfRift=counter;
228 for (l=0;l<NumGridElementListOnOneSideOfRift;l++){
229 GridElementListOnOneSideOfRift[l]=GridElementListOnOneSideOfRift[l+1];
235 xDelete<int>(GridElements);
237 *pNumGridElementListOnOneSideOfRift=NumGridElementListOnOneSideOfRift;
238 *pGridElementListOnOneSideOfRift=GridElementListOnOneSideOfRift;
241 int UpdateSegments(
int** psegments,
int** psegmentmarkerlist,
int* pnsegs,
int* index,
double* x,
double* y,
int* riftsegments,
int nriftsegs,
int nods,
int nel){
247 int *segments = NULL;
248 int *segmentmarkerlist = NULL;
252 segments = *psegments;
253 segmentmarkerlist = *psegmentmarkerlist;
257 segments =xReNew<int>(segments, nsegs*3,(nsegs+nriftsegs)*3);
258 segmentmarkerlist=xReNew<int>(segmentmarkerlist,nsegs,(nsegs+nriftsegs));
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)){
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);
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);
282 *(segments+3*(nsegs+i)+2)=el2+1;
283 *(segmentmarkerlist+(nsegs+i))=*(segmentmarkerlist+j);
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);
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);
297 if (*(segments+3*j+2)==(el2+1)){
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);
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);
313 *(segments+3*(nsegs+i)+2)=el1+1;
314 *(segmentmarkerlist+(nsegs+i))=*(segmentmarkerlist+j);
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);
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);
334 *psegmentmarkerlist=segmentmarkerlist;
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))){
350 int SplitRiftSegments(
int** psegments,
int** psegmentmarkerlist,
int* pnumsegs,
int* pnumrifts,
int** priftsnumsegs,
int*** priftssegments,
int numrifts,
int nods,
int nel){
359 int *segments = NULL;
360 int *segmentmarkerlist = NULL;
365 int *riftsnumsegs = NULL;
366 int **riftssegments = NULL;
367 int *new_segments = NULL;
368 int *new_segmentmarkers = NULL;
371 int* riftsegment=NULL;
374 segments = *psegments;
376 segmentmarkerlist = *psegmentmarkerlist;
380 for (i=0;i<numsegs;i++){
381 if (segmentmarkerlist[i]==1)counter++;
385 new_segments=xNew<int>(new_numsegs*3);
386 new_segmentmarkers=xNew<int>(new_numsegs);
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];
401 riftsnumsegs=xNew<int>(numrifts);
402 riftssegments=xNew<int*>(numrifts);
403 for (i=0;i<numrifts;i++){
406 for (j=0;j<numsegs;j++){
407 if (segmentmarkerlist[j]==2+i)counter++;
409 riftsnumsegs[i]=counter;
410 riftsegment=xNew<int>(counter*3);
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);
421 *(riftssegments+i)=riftsegment;
425 xDelete<int>(segments);
428 *psegments=new_segments;
429 *psegmentmarkerlist=new_segmentmarkers;
430 *pnumsegs=new_numsegs;
432 *priftssegments=riftssegments;
433 *priftsnumsegs=riftsnumsegs;
436 int PairRiftElements(
int** priftsnumpairs,
int*** priftspairs,
int numrifts,
int* riftsnumsegments,
int** riftssegments,
double* x,
double* y){
442 int *riftsnumpairs = NULL;
443 int **riftspairs = NULL;
449 int node1,node2,node3,node4;
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];
460 node1=segments[3*j+0]-1; node2=segments[3*j+1]-1;
462 for (k=0;k<numsegs;k++){
464 node3=segments[3*k+0]-1; node4=segments[3*k+1]-1;
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])) ){
469 pairs[2*j+1]=segments[3*k+2];
478 *priftsnumpairs=riftsnumpairs;
479 *priftspairs=riftspairs;
482 int IsRiftPresent(
int* priftflag,
int* pnumrifts,
int* segmentmarkerlist,
int nsegs){
495 for (i=0;i<nsegs;i++){
496 if (segmentmarkerlist[i]>maxmark){
498 maxmark=segmentmarkerlist[i];
501 if(numrifts)riftflag=1;
508 int OrderRifts(
int** priftstips,
int** riftssegments,
int** riftspairs,
int numrifts,
int* riftsnumsegments,
double* x,
double* y,
int nods,
int nels){
514 int *riftsegments = NULL;
515 int *riftpairs = NULL;
520 int *riftsegments_copy = NULL;
521 int *riftpairs_copy = NULL;
524 int node1,node2,node3,node4,temp_node,tip1,tip2,node;
526 int already_ordered=0;
532 riftstips=xNew<int>(numrifts*2);
535 for (i=0;i<numrifts;i++){
536 riftsegments = riftssegments[i];
537 riftpairs = riftspairs[i];
538 numsegs = riftsnumsegments[i];
542 riftsegments_copy=xNew<int>(numsegs*3);
543 riftpairs_copy=xNew<int>(numsegs*2);
544 order=xNew<int>(numsegs);
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);
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);
564 _assert_(node1<nods+1 && node4<nods+1);
566 if ((x[node1-1]==x[node4-1]) && (y[node1-1]==y[node4-1])){
580 if ((tip2==-1) && (node1!=tip1)){
592 if ((tip2==-1) && (node2!=tip1)){
600 *(riftstips+2*i+0)=tip1;
601 *(riftstips+2*i+1)=tip2;
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);
611 if ((node1==node) || (node2==node)){
614 for (k=0;k<counter;k++){
620 if (!already_ordered){
625 else if(node2==node){
635 for (j=0;j<numsegs;j++){
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);
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);
653 xDelete<int>(riftsegments_copy);
654 xDelete<int>(riftpairs_copy);
659 *priftstips=riftstips;
662 int PenaltyPairs(
double*** priftspenaltypairs,
int** priftsnumpenaltypairs,
int numrifts,
int** riftssegments,
663 int* riftsnumsegs,
int** riftspairs,
int* riftstips,
double* x,
double* y){
668 double el1,el2,node1,node2,node3,node4;
672 double **riftspenaltypairs = NULL;
673 double *riftpenaltypairs = NULL;
674 int *riftsnumpenaltypairs = NULL;
678 int* riftsegments=NULL;
686 riftspenaltypairs=xNew<double*>(numrifts);
687 riftsnumpenaltypairs=xNew<int>(numrifts);
689 for(i=0;i<numrifts;i++){
690 numsegs=riftsnumsegs[i];
691 riftsegments=riftssegments[i];
692 riftpairs=riftspairs[i];
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);
706 for(k=0;k<numsegs;k++){
707 if(*(riftsegments+3*k+2)==el2){
712 node3=*(riftsegments+3*k0+0);
713 node4=*(riftsegments+3*k0+1);
716 if ((x[(
int)node1-1]==x[(int)node4-1]) && (y[(int)node1-1]==y[(
int)node4-1])){
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));
734 for(k=0;k<counter;k++){
735 if( (*(riftpenaltypairs+k*7+0))==node1){
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;
751 *(riftpenaltypairs+k1*7+4)+=normal[0];
752 *(riftpenaltypairs+k1*7+5)+=normal[1];
753 *(riftpenaltypairs+k1*7+6)+=length/2;
758 for(k=0;k<counter;k++){
759 if( (*(riftpenaltypairs+k*7+0))==node2){
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;
775 *(riftpenaltypairs+k2*7+4)+=normal[0];
776 *(riftpenaltypairs+k2*7+5)+=normal[1];
777 *(riftpenaltypairs+k2*7+6)+=length/2;
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;
788 riftspenaltypairs[i]=riftpenaltypairs;
789 riftsnumpenaltypairs[i]=(numsegs/2-1);
793 *priftspenaltypairs=riftspenaltypairs;
794 *priftsnumpenaltypairs=riftsnumpenaltypairs;
797 int RemoveCornersFromRifts(
int** pindex,
int* pnel,
double** px,
double** py,
int* pnods,
int* segments,
int* segmentmarkers,
int num_seg){
801 int node1,node2,node3;
808 int *index = *pindex;
814 for (i=0;i<num_seg;i++){
815 node1=*(segments+3*i+0);
816 node2=*(segments+3*i+1);
820 if (*(index+3*j+0)==node1){
821 if ((*(index+3*j+1)==node2) || (*(index+3*j+2)==node2)){
826 if (*(index+3*j+1)==node1){
827 if ((*(index+3*j+0)==node2) || (*(index+3*j+2)==node2)){
832 if (*(index+3*j+2)==node1){
833 if ((*(index+3*j+0)==node2) || (*(index+3*j+1)==node2)){
841 if ((pair_count==0) || (pair_count==1)){
845 for (j=0;j<pair_count;j++){
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);
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);
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);
862 for (k=0;k<num_seg;k++){
863 if ((node3==*(segments+3*k+0)) || (node3==*(segments+3*k+1))){
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));
876 *(index+3*el+0)=node1;
877 *(index+3*el+1)=node2;
878 *(index+3*el+2)=nods+1;
880 *(index+3*nel+0)=node2;
881 *(index+3*nel+1)=node3;
882 *(index+3*nel+2)=nods+1;
884 *(index+3*(nel+1)+0)=node3;
885 *(index+3*(nel+1)+1)=node1;
886 *(index+3*(nel+1)+2)=nods+1;
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;