00001
00038 #ifndef _GEM_H_
00039 #define _GEM_H_
00040
00041 #include <mc/mc_base.h>
00042
00043 #include <mc/pde.h>
00044
00045 #include <mc/vel.h>
00046 #include <mc/ves.h>
00047
00048 #include <mc/bam.h>
00049
00052 #define VMAXSQ 2
00053
00054
00061 struct sGem {
00062
00064 int dim;
00066 int dimII;
00068 int dimVV;
00070 int dimEE;
00071
00073 int numVV0;
00075 int numVV;
00077 int numEE;
00079 int numFF;
00081 int numSS;
00083 int numBV;
00085 int numBF;
00086
00088 Vmem *vmem;
00090 int iMadeVmem;
00091
00093 Vset *vertices;
00095 Vset *edges;
00097 Vset *simplices;
00098
00100 Vset *sQueM[VMAXSQ];
00101
00103 int iMadePDE;
00105 PDE *pde;
00106
00108 int xUpFlag;
00110 void (*xUp)(SS **sms, int numS);
00111
00112 };
00113
00120 typedef struct sGem Gem;
00121
00122
00123
00124
00125
00126
00127
00128 #if !defined(VINLINE_GEM)
00129
00137 int Gem_dim(Gem *thee);
00138
00147 int Gem_dimII(Gem *thee);
00148
00157 int Gem_dimVV(Gem *thee);
00158
00167 int Gem_dimEE(Gem *thee);
00168
00177 int Gem_numVirtVV(Gem *thee);
00178
00187 int Gem_numVirtEE(Gem *thee);
00188
00197 int Gem_numVirtFF(Gem *thee);
00198
00207 int Gem_numVirtSS(Gem *thee);
00208
00218 void Gem_setNumVirtVV(Gem *thee, int i);
00219
00229 void Gem_setNumVirtEE(Gem *thee, int i);
00230
00240 void Gem_setNumVirtFF(Gem *thee, int i);
00241
00251 void Gem_setNumVirtSS(Gem *thee, int i);
00252
00261 int Gem_numVV(Gem *thee);
00262
00272 VV* Gem_VV(Gem *thee, int i);
00273
00282 VV* Gem_createVV(Gem *thee);
00283
00292 VV* Gem_firstVV(Gem *thee);
00293
00302 VV* Gem_lastVV(Gem *thee);
00303
00312 VV* Gem_nextVV(Gem *thee);
00313
00322 VV* Gem_prevVV(Gem *thee);
00323
00332 VV* Gem_peekFirstVV(Gem *thee);
00333
00342 VV* Gem_peekLastVV(Gem *thee);
00343
00352 void Gem_destroyVV(Gem *thee);
00353
00362 void Gem_resetVV(Gem *thee);
00363
00372 int Gem_numEE(Gem *thee);
00373
00383 EE* Gem_EE(Gem *thee, int i);
00384
00393 EE* Gem_createEE(Gem *thee);
00394
00403 EE* Gem_firstEE(Gem *thee);
00404
00413 EE* Gem_lastEE(Gem *thee);
00414
00423 EE* Gem_nextEE(Gem *thee);
00424
00433 EE* Gem_prevEE(Gem *thee);
00434
00443 EE* Gem_peekFirstEE(Gem *thee);
00444
00453 EE* Gem_peekLastEE(Gem *thee);
00454
00463 void Gem_destroyEE(Gem *thee);
00464
00473 void Gem_resetEE(Gem *thee);
00474
00483 int Gem_numSS(Gem *thee);
00484
00494 SS* Gem_SS(Gem *thee, int i);
00495
00504 SS* Gem_createSS(Gem *thee);
00505
00514 SS* Gem_firstSS(Gem *thee);
00515
00524 SS* Gem_lastSS(Gem *thee);
00525
00534 SS* Gem_nextSS(Gem *thee);
00535
00544 SS* Gem_prevSS(Gem *thee);
00545
00554 SS* Gem_peekFirstSS(Gem *thee);
00555
00564 SS* Gem_peekLastSS(Gem *thee);
00565
00574 void Gem_destroySS(Gem *thee);
00575
00584 void Gem_resetSS(Gem *thee);
00585
00595 int Gem_numSQ(Gem *thee, int currentQ);
00596
00606 void Gem_resetSQ(Gem *thee, int currentQ);
00607
00616 int Gem_numBF(Gem *thee);
00617
00626 int Gem_numBV(Gem *thee);
00627
00637 void Gem_setNumBF(Gem *thee, int val);
00638
00648 void Gem_setNumBV(Gem *thee, int val);
00649
00659 void Gem_addToNumBF(Gem *thee, int val);
00660
00670 void Gem_addToNumBV(Gem *thee, int val);
00671
00680 void Gem_numBFpp(Gem *thee);
00681
00690 void Gem_numBVpp(Gem *thee);
00691
00700 void Gem_numBFmm(Gem *thee);
00701
00710 void Gem_numBVmm(Gem *thee);
00711 #else
00712
00721 # define Gem_dim(thee) ((thee)->dim)
00722
00731 # define Gem_dimII(thee) ((thee)->dimII)
00732
00741 # define Gem_dimVV(thee) ((thee)->dimVV)
00742
00751 # define Gem_dimEE(thee) ((thee)->dimEE)
00752
00761 # define Gem_numVirtVV(thee) ((thee)->numVV)
00762
00771 # define Gem_numVirtEE(thee) ((thee)->numEE)
00772
00781 # define Gem_numVirtFF(thee) ((thee)->numFF)
00782
00791 # define Gem_numVirtSS(thee) ((thee)->numSS)
00792
00802 # define Gem_setNumVirtVV(thee,i) ((thee)->numVV = (i))
00803
00813 # define Gem_setNumVirtEE(thee,i) ((thee)->numEE = (i))
00814
00824 # define Gem_setNumVirtFF(thee,i) ((thee)->numFF = (i))
00825
00835 # define Gem_setNumVirtSS(thee,i) ((thee)->numSS = (i))
00836
00845 # define Gem_numVV(thee) (Vset_num((thee)->vertices))
00846
00856 # define Gem_VV(thee,i) ((VV*)Vset_access((thee)->vertices,(i)))
00857
00866 # define Gem_createVV(thee) ((VV*)Vset_create((thee)->vertices))
00867
00876 # define Gem_firstVV(thee) ((VV*)Vset_first((thee)->vertices))
00877
00886 # define Gem_lastVV(thee) ((VV*)Vset_last((thee)->vertices))
00887
00896 # define Gem_nextVV(thee) ((VV*)Vset_next((thee)->vertices))
00897
00906 # define Gem_prevVV(thee) ((VV*)Vset_prev((thee)->vertices))
00907
00916 # define Gem_peekFirstVV(thee) ((VV*)Vset_peekFirst((thee)->vertices))
00917
00926 # define Gem_peekLastVV(thee) ((VV*)Vset_peekLast((thee)->vertices))
00927
00936 # define Gem_destroyVV(thee) (Vset_destroy((thee)->vertices))
00937
00946 # define Gem_resetVV(thee) (Vset_reset((thee)->vertices))
00947
00956 # define Gem_numEE(thee) (Vset_num((thee)->edges))
00957
00967 # define Gem_EE(thee,i) ((EE*)Vset_access((thee)->edges,(i)))
00968
00977 # define Gem_createEE(thee) ((EE*)Vset_create((thee)->edges))
00978
00987 # define Gem_firstEE(thee) ((EE*)Vset_first((thee)->edges))
00988
00997 # define Gem_lastEE(thee) ((EE*)Vset_last((thee)->edges))
00998
01007 # define Gem_nextEE(thee) ((EE*)Vset_next((thee)->edges))
01008
01017 # define Gem_prevEE(thee) ((EE*)Vset_prev((thee)->edges))
01018
01027 # define Gem_peekFirstEE(thee) ((EE*)Vset_peekFirst((thee)->edges))
01028
01037 # define Gem_peekLastEE(thee) ((EE*)Vset_peekLast((thee)->edges))
01038
01047 # define Gem_destroyEE(thee) (Vset_destroy((thee)->edges))
01048
01057 # define Gem_resetEE(thee) (Vset_reset((thee)->edges))
01058
01067 # define Gem_numSS(thee) (Vset_num((thee)->simplices))
01068
01078 # define Gem_SS(thee,i) ((SS*)Vset_access((thee)->simplices,(i)))
01079
01088 # define Gem_createSS(thee) ((SS*)Vset_create((thee)->simplices))
01089
01098 # define Gem_firstSS(thee) ((SS*)Vset_first((thee)->simplices))
01099
01108 # define Gem_lastSS(thee) ((SS*)Vset_last((thee)->simplices))
01109
01118 # define Gem_nextSS(thee) ((SS*)Vset_next((thee)->simplices))
01119
01128 # define Gem_prevSS(thee) ((SS*)Vset_prev((thee)->simplices))
01129
01138 # define Gem_peekFirstSS(thee) ((SS*)Vset_peekFirst((thee)->simplices))
01139
01148 # define Gem_peekLastSS(thee) ((SS*)Vset_peekLast((thee)->simplices))
01149
01158 # define Gem_destroySS(thee) (Vset_destroy((thee)->simplices))
01159
01168 # define Gem_resetSS(thee) (Vset_reset((thee)->simplices))
01169
01179 # define Gem_numSQ(thee,currentQ) (Vset_num((thee)->sQueM[(currentQ)]))
01180
01190 # define Gem_resetSQ(thee,currentQ) (Vset_reset((thee)->sQueM[(currentQ)]))
01191
01200 # define Gem_numBF(thee) ((thee)->numBF)
01201
01210 # define Gem_numBV(thee) ((thee)->numBV)
01211
01221 # define Gem_setNumBF(thee,val) ((thee)->numBF = (val))
01222
01232 # define Gem_setNumBV(thee,val) ((thee)->numBV = (val))
01233
01243 # define Gem_addToNumBF(thee,val) ((thee)->numBF += (val))
01244
01254 # define Gem_addToNumBV(thee,val) ((thee)->numBV += (val))
01255
01264 # define Gem_numBFpp(thee) ((thee)->numBF++)
01265
01274 # define Gem_numBVpp(thee) ((thee)->numBV++)
01275
01284 # define Gem_numBFmm(thee) ((thee)->numBF--)
01285
01294 # define Gem_numBVmm(thee) ((thee)->numBV--)
01295 #endif
01296
01297
01307 Gem* Gem_ctor(Vmem *vmem, PDE *tpde);
01308
01317 void Gem_dtor(Gem **thee);
01318
01329 void Gem_reset(Gem *thee, int dim, int dimII);
01330
01339 VV* Gem_createAndInitVV(Gem *thee);
01340
01349 EE* Gem_createAndInitEE(Gem *thee);
01350
01359 SS* Gem_createAndInitSS(Gem *thee);
01360
01371 SS* Gem_SQ(Gem *thee, int currentQ, int i);
01372
01383 void Gem_appendSQ(Gem *thee, int currentQ, SS *qsm);
01384
01393 void Gem_createSimplexRings(Gem *thee);
01394
01403 void Gem_destroySimplexRings(Gem *thee);
01404
01418 EE* Gem_findOrCreateEdge(Gem *thee, VV *v0, VV *v1, int *iDid);
01419
01431 void Gem_createEdges(Gem *thee);
01432
01441 void Gem_destroyEdges(Gem *thee);
01442
01452 void Gem_countChk(Gem *thee);
01453
01463 void Gem_countFaces(Gem *thee);
01464
01473 void Gem_clearEdges(Gem *thee);
01474
01485 void Gem_countEdges(Gem *thee);
01486
01496 void Gem_formFix(Gem *thee, int key);
01497
01498 #if 0
01499
01511 int Gem_externalUpdateFlag(Gem *thee);
01525 void Gem_setExternalUpdateFlag(Gem *thee, int fl);
01538 void Gem_setExternalUpdateFunction(Gem *thee,
01539 void (*xUp)(SS **sms, int numS));
01540 #endif
01541
01542
01586 void Gem_simplexInfo(Gem *thee, SS *sm, TT *t);
01587
01601 void Gem_buildVolumeTrans(Gem *thee, SS *sm, TT *t);
01602
01624 void Gem_buildSurfaceTrans(Gem *thee, int iface, TT *t);
01625
01636 double Gem_edgeLength(Gem *thee, VV *v0, VV *v1);
01637
01650 int Gem_newestVertex(Gem *thee, SS *sm, int face, double *len);
01651
01668 int Gem_longestEdge(Gem *thee, SS *sm, int face, double *len);
01669
01686 int Gem_shortestEdge(Gem *thee, SS *sm, int face, double *len);
01687
01745 double Gem_shapeMeasure(Gem *thee, SS *sm, double *f, double *g);
01746
01760 void Gem_shapeMeasureGrad(Gem *thee, SS *sm, int vmap[], double dm[]);
01761
01771 double Gem_edgeRatio(Gem *thee, SS *sm);
01772
01796 double Gem_simplexVolume(Gem *thee, SS *sm);
01797
01806 void Gem_shapeChk(Gem *thee);
01807
01816 void Gem_markEdges(Gem *thee);
01817
01829 void Gem_reorderSV(Gem *thee);
01830
01840 void Gem_smoothMeshLaplace(Gem *thee);
01841
01851 void Gem_smoothMesh(Gem *thee);
01852
01861 void Gem_smoothMeshBnd(Gem *thee);
01862
01871 void Gem_smoothMeshOpt(Gem *thee);
01872
01881 void Gem_buildCharts(Gem *thee);
01882
01891 void Gem_clearCharts(Gem *thee);
01892
01901 void Gem_memChk(Gem *thee);
01902
01916 void Gem_memChkVV(Gem *thee, int *num,
01917 int *size, int *vecUse, int *vecMal, int *vecOhd);
01918
01932 void Gem_memChkEE(Gem *thee, int *tnum,
01933 int *size, int *vecUse, int *vecMal, int *vecOhd);
01934
01948 void Gem_memChkSS(Gem *thee, int *tnum,
01949 int *size, int *vecUse, int *vecMal, int *vecOhd);
01950
01965 void Gem_memChkSQ(Gem *thee, int currentQ,
01966 int *tnum, int *tsize, int *tVecUse, int *tVecMal, int *tVecOhd);
01967
01976 void Gem_memChkMore(Gem *thee);
01977
01986 void Gem_speedChk(Gem *thee);
01987
02000 void Gem_formChk(Gem *thee, int key);
02001
02010 void Gem_contentChk(Gem *thee);
02011
02023 void Gem_ramClear(Gem *thee, int key);
02024
02036 void Gem_makeBnd(Gem *thee, int btype);
02037
02051 void Gem_makeBndExt(Gem *thee, int key);
02052
02121 void Gem_delaunay(Gem *thee);
02122
02132 void Gem_flip(Gem *thee, VV *vx);
02133
02143 SS* Gem_findSimplex(Gem *thee, VV *vx);
02144
02153 void Gem_predinit(Gem *thee);
02154
02164 int Gem_orient(Gem *thee, SS *sm);
02165
02178 int Gem_inSphere(Gem *thee, SS *sm, int sm_facet, VV *vx, VV *vxnb);
02179
02190 int Gem_pointInSimplex(Gem *thee, SS *sm, double x[]);
02191
02204 int Gem_pointInSimplexVal(Gem *thee, SS *sm, double x[],
02205 double phi[], double phix[][3]);
02206
02217 int Gem_deform(Gem *thee, int dimX, double *defX[MAXV]);
02218
02232 int Gem_markRefine(Gem *thee, int key, int color);
02233
02335 int Gem_refine(Gem *thee, int rkey, int bkey, int pkey);
02336
02405 void Gem_refineEdge(Gem *thee, int currentQ,
02406 SS *sm, VV *v[4], VV **vAB, int A, int B);
02407
02419 void Gem_octsect(Gem *thee, SS *sm, int currentQ);
02420
02436 void Gem_bisectLE(Gem *thee, SS *sm, int currentQ);
02437
02559 void Gem_bisectNV(Gem *thee, SS *sm, int currentQ);
02560
02576 void Gem_bisectNP(Gem *thee, SS *sm, int currentQ);
02577
02609 int Gem_unRefine(Gem *thee, int rkey, int pkey);
02610
02621 void Gem_delSimplex(Gem *thee, SS *sm, int currentQ);
02622
02631 void Gem_unHangVertices(Gem *thee);
02632
02724 int Gem_read(Gem *thee, int key, Vio *sock);
02725
02745 void Gem_write(Gem *thee, int key, Vio *sock, int fkey);
02746
02757 void Gem_writeFace3d(Gem *thee, Vio *sock);
02758
02868 int Gem_readEdge(Gem *thee, Vio *sock);
02869
02880 void Gem_writeEdge(Gem *thee, Vio *sock);
02881
02957 void Gem_buildSfromE(Gem *thee);
02958
02970 void Gem_writeBrep(Gem *thee, Vio *sock);
02971
02982 void Gem_writeBrep2(Gem *thee, Vio *sock);
02983
02994 void Gem_writeBrep3(Gem *thee, Vio *sock);
02995
03006 void Gem_writeBrep2to3(Gem *thee, Vio *sock);
03007
03036 void Gem_writeGEOM(Gem *thee, Vio *sock,
03037 int defKey, int colKey, int chartKey, double gluVal, int fkey,
03038 double *defX[MAXV], char *format);
03039
03057 void Gem_writeSOL(Gem *thee, Vio *sock,
03058 int fldKey,
03059 double *defX[MAXV], char *format);
03060
03070 void Gem_writeVolHeaderOFF(Gem *thee, Vio *sock);
03071
03081 void Gem_writeBndHeaderOFF(Gem *thee, Vio *sock);
03082
03092 void Gem_writeTrailerOFF(Gem *thee, Vio *sock);
03093
03117 void Gem_writeGV(Gem *thee, Vio *sock,
03118 int defKey, int colKey, int chartKey, double gluVal, int fkey,
03119 double *defX[MAXV]);
03120
03142 void Gem_writeFace2dGV(Gem *thee, Vio *sock,
03143 int defKey, int colKey, int chartKey, double gluVal,
03144 double *defX[MAXV]);
03145
03167 void Gem_writeFace3dGV(Gem *thee, Vio *sock,
03168 int defKey, int colKey, int chartKey, double gluVal,
03169 double *defX[MAXV]);
03170
03180 void Gem_writeHeaderMATH(Gem *thee, Vio *sock);
03181
03191 void Gem_writeTrailerMATH(Gem *thee, Vio *sock);
03192
03216 void Gem_writeMATH(Gem *thee, Vio *sock,
03217 int defKey, int colKey, int chartKey, double gluVal, int fkey,
03218 double *defX[MAXV]);
03219
03236 void Gem_writeGMV(Gem *thee, Vio *sock,
03237 int fldKey, double *defX[MAXV]);
03238
03274 void Gem_writeUCD(Gem *thee, Vio *sock,
03275 int fldKey, double *defX[MAXV]);
03276
03277
03295 void Gem_writeDX(Gem *thee, Vio *sock,
03296 int fldKey, double *defX[MAXV]);
03297
03315 void Gem_writeTEC(Gem *thee, Vio *sock,
03316 int fldKey, double *defX[MAXV]);
03317
03318
03319
03320
03321
03322
03323
03324
03325
03326
03327
03328
03329
03338 void Gem_makeCube(Gem *thee);
03339
03348 void Gem_makeOctahedron(Gem *thee);
03349
03358 void Gem_makeIcosahedron(Gem *thee);
03359
03360 #endif
03361
03362