Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/classifyhpel.hpp
3206 views
HPREF_ELEMENT_TYPE ClassifyTet(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,1BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,2INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)3{4int ep1(0), ep2(0), ep3(0), ep4(0), cp1(0), cp2(0), cp3(0), cp4(0), fp1, fp2, fp3, fp4;5int isedge1(0), isedge2(0), isedge3(0), isedge4(0), isedge5(0), isedge6(0);6int isfedge1, isfedge2, isfedge3, isfedge4, isfedge5, isfedge6;7int isface1(0), isface2(0), isface3(0), isface4(0);89HPREF_ELEMENT_TYPE type = HP_NONE;101112int debug = 0;13for (int j = 0;j < 4; j++)14{15if (el.pnums[j] == 444) debug++;16if (el.pnums[j] == 115) debug++;17if (el.pnums[j] == 382) debug++;18if (el.pnums[j] == 281) debug++;19}20if (debug < 4) debug = 0;21222324for (int j = 0; j < 4; j++)25for (int k = 0; k < 4; k++)26{27if (j == k) continue;28if (type) break;2930int pi3 = 0;31while (pi3 == j || pi3 == k) pi3++;32int pi4 = 6 - j - k - pi3;3334// preserve orientation35int sort[4];36sort[0] = j; sort[1] = k; sort[2] = pi3; sort[3] = pi4;37int cnt = 0;38for (int jj = 0; jj < 4; jj++)39for (int kk = 0; kk < 3; kk++)40if (sort[kk] > sort[kk+1])41{42cnt++;43Swap (sort[kk], sort[kk+1]);44}45if (cnt % 2 == 1) Swap (pi3, pi4);4647ep1 = edgepoint.Test (el.pnums[j]);48ep2 = edgepoint.Test (el.pnums[k]);49ep3 = edgepoint.Test (el.pnums[pi3]);50ep4 = edgepoint.Test (el.pnums[pi4]);5152cp1 = cornerpoint.Test (el.pnums[j]);53cp2 = cornerpoint.Test (el.pnums[k]);54cp3 = cornerpoint.Test (el.pnums[pi3]);55cp4 = cornerpoint.Test (el.pnums[pi4]);5657isedge1 = edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[k]));58isedge2 = edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi3]));59isedge3 = edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi4]));60isedge4 = edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi3]));61isedge5 = edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi4]));62isedge6 = edges.Used (INDEX_2::Sort (el.pnums[pi3], el.pnums[pi4]));6364if (debug)65{66cout << "debug" << endl;67*testout << "debug" << endl;68*testout << "ep = " << ep1 << ep2 << ep3 << ep4 << endl;69*testout << "cp = " << cp1 << cp2 << cp3 << cp4 << endl;70*testout << "edge = " << isedge1 << isedge2 << isedge3 << isedge4 << isedge5 << isedge6 << endl;71}727374isface1 = isface2 = isface3 = isface4 = 0;75for (int l = 0; l < 4; l++)76{77INDEX_3 i3(0,0,0);78switch (l)79{80case 0: i3.I1() = el.pnums[k]; i3.I1() = el.pnums[pi3]; i3.I1() = el.pnums[pi4]; break;81case 1: i3.I1() = el.pnums[j]; i3.I1() = el.pnums[pi3]; i3.I1() = el.pnums[pi4]; break;82case 2: i3.I1() = el.pnums[j]; i3.I1() = el.pnums[k]; i3.I1() = el.pnums[pi4]; break;83case 3: i3.I1() = el.pnums[j]; i3.I1() = el.pnums[k]; i3.I1() = el.pnums[pi3]; break;84}85i3.Sort();86if (faces.Used (i3))87{88int domnr = faces.Get(i3);89if (domnr == -1 || domnr == el.GetIndex())90{91switch (l)92{93case 0: isface1 = 1; break;94case 1: isface2 = 1; break;95case 2: isface3 = 1; break;96case 3: isface4 = 1; break;97}98}99}100}101/*102isface1 = faces.Used (INDEX_3::Sort (el.pnums[k], el.pnums[pi3], el.pnums[pi4]));103isface2 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[pi3], el.pnums[pi4]));104isface3 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[k], el.pnums[pi4]));105isface4 = faces.Used (INDEX_3::Sort (el.pnums[j], el.pnums[k], el.pnums[pi3]));106*/107108isfedge1 = isfedge2 = isfedge3 = isfedge4 = isfedge5 = isfedge6 = 0;109for (int l = 0; l < 6; l++)110{111INDEX_2 i2(0,0);112switch (l)113{114case 0: i2.I1() = el.pnums[j]; i2.I2() = el[k]; break;115case 1: i2.I1() = el.pnums[j]; i2.I2() = el.pnums[pi3]; break;116case 2: i2.I1() = el.pnums[j]; i2.I2() = el.pnums[pi4]; break;117case 3: i2.I1() = el.pnums[k]; i2.I2() = el.pnums[pi3]; break;118case 4: i2.I1() = el.pnums[k]; i2.I2() = el.pnums[pi4]; break;119case 5: i2.I1() = el.pnums[pi3]; i2.I2() = el.pnums[pi4]; break;120}121i2.Sort();122if (face_edges.Used (i2))123{124int domnr = face_edges.Get(i2);125if (domnr == -1 || domnr == el.GetIndex())126{127switch (l)128{129case 0: isfedge1 = 1; break;130case 1: isfedge2 = 1; break;131case 2: isfedge3 = 1; break;132case 3: isfedge4 = 1; break;133case 4: isfedge5 = 1; break;134case 5: isfedge6 = 1; break;135}136}137}138}139/*140isfedge1 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[k]));141isfedge2 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi3]));142isfedge3 = face_edges.Used (INDEX_2::Sort (el.pnums[j], el.pnums[pi4]));143isfedge4 = face_edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi3]));144isfedge5 = face_edges.Used (INDEX_2::Sort (el.pnums[k], el.pnums[pi4]));145isfedge6 = face_edges.Used (INDEX_2::Sort (el.pnums[pi3], el.pnums[pi4]));146*/147148fp1 = fp2 = fp3 = fp4 = 0;149for (int l = 0; l < 4; l++)150{151int pti(0);152switch (l)153{154case 0: pti = el.pnums[j]; break;155case 1: pti = el.pnums[k]; break;156case 2: pti = el.pnums[pi3]; break;157case 3: pti = el.pnums[pi4]; break;158}159int domnr = facepoint[pti];160if (domnr == -1 || domnr == el.GetIndex())161{162switch (l)163{164case 0: fp1 = 1; break;165case 1: fp2 = 1; break;166case 2: fp3 = 1; break;167case 3: fp4 = 1; break;168}169}170}171172/*173fp1 = facepoint[el.pnums[j]] != 0;174fp2 = facepoint[el.pnums[k]] != 0;175fp3 = facepoint[el.pnums[pi3]] != 0;176fp4 = facepoint[el.pnums[pi4]] != 0;177*/178179180switch (isface1+isface2+isface3+isface4)181{182case 0:183{184isedge1 |= isfedge1;185isedge2 |= isfedge2;186isedge3 |= isfedge3;187isedge4 |= isfedge4;188isedge5 |= isfedge5;189isedge6 |= isfedge6;190191ep1 |= fp1;192ep2 |= fp2;193ep3 |= fp3;194ep4 |= fp4;195196switch (isedge1+isedge2+isedge3+isedge4+isedge5+isedge6)197{198case 0:199{200if (!ep1 && !ep2 && !ep3 && !ep4)201type = HP_TET;202203if (ep1 && !ep2 && !ep3 && !ep4)204type = HP_TET_0E_1V;205206if (ep1 && ep2 && !ep3 && !ep4)207type = HP_TET_0E_2V;208209if (ep1 && ep2 && ep3 && !ep4)210type = HP_TET_0E_3V;211212if (ep1 && ep2 && ep3 && ep4)213type = HP_TET_0E_4V;214215break;216}217218case 1:219{220if (!isedge1) break;221222if (!cp1 && !cp2 && !ep3 && !ep4)223type = HP_TET_1E_0V;224225if (cp1 && !cp2 && !ep3 && !ep4)226type = HP_TET_1E_1VA;227228if (!cp1 && !cp2 && !ep3 && ep4)229type = HP_TET_1E_1VB;230231if (cp1 && cp2 && !ep3 && !ep4)232type = HP_TET_1E_2VA;233234if (cp1 && !cp2 && ep3 && !ep4)235type = HP_TET_1E_2VB;236237if (cp1 && !cp2 && !ep3 && ep4)238type = HP_TET_1E_2VC;239240if (!cp1 && !cp2 && ep3 && ep4)241type = HP_TET_1E_2VD;242243if (cp1 && cp2 && ep3 && !ep4)244type = HP_TET_1E_3VA;245246if (cp1 && !cp2 && ep3 && ep4)247type = HP_TET_1E_3VB;248249if (cp1 && cp2 && ep3 && ep4)250type = HP_TET_1E_4V;251252break;253}254case 2:255{256if (isedge1 && isedge2)257{258if (!cp2 && !cp3 && !ep4)259type = HP_TET_2EA_0V;260261if (cp2 && !cp3 && !ep4)262type = HP_TET_2EA_1VA;263if (!cp2 && cp3 && !ep4)264type = HP_TET_2EA_1VB;265266if (!cp2 && !cp3 && ep4)267type = HP_TET_2EA_1VC;268269if (cp2 && cp3 && !ep4)270type = HP_TET_2EA_2VA;271if (cp2 && !cp3 && ep4)272type = HP_TET_2EA_2VB;273if (!cp2 && cp3 && ep4)274type = HP_TET_2EA_2VC;275276if (cp2 && cp3 && ep4)277type = HP_TET_2EA_3V;278}279if (isedge1 && isedge6)280{281if (!cp1 && !cp2 && !cp3 && !cp4)282type = HP_TET_2EB_0V;283if (cp1 && !cp2 && !cp3 && !cp4)284type = HP_TET_2EB_1V;285if (cp1 && cp2 && !cp3 && !cp4)286type = HP_TET_2EB_2VA;287if (cp1 && !cp2 && cp3 && !cp4)288type = HP_TET_2EB_2VB;289if (cp1 && !cp2 && !cp3 && cp4)290type = HP_TET_2EB_2VC;291if (cp1 && cp2 && cp3 && !cp4)292type = HP_TET_2EB_3V;293if (cp1 && cp2 && cp3 && cp4)294type = HP_TET_2EB_4V;295}296break;297}298case 3:299{300if (isedge1 && isedge2 && isedge3)301{302if (!cp2 && !cp3 && !cp4)303type = HP_TET_3EA_0V;304if (cp2 && !cp3 && !cp4)305type = HP_TET_3EA_1V;306if (cp2 && cp3 && !cp4)307type = HP_TET_3EA_2V;308if (cp2 && cp3 && cp4)309type = HP_TET_3EA_3V;310}311if (isedge1 && isedge3 && isedge4)312{313if (!cp3 && !cp4)314type = HP_TET_3EB_0V;315if (cp3 && !cp4)316type = HP_TET_3EB_1V;317if (cp3 && cp4)318type = HP_TET_3EB_2V;319}320if (isedge1 && isedge2 && isedge5)321{322if (!cp3 && !cp4)323type = HP_TET_3EC_0V;324if (cp3 && !cp4)325type = HP_TET_3EC_1V;326if (cp3 && cp4)327type = HP_TET_3EC_2V;328}329break;330}331}332break;333}334335336337case 1: // one singular face338{339if (!isface1) break;340341switch (isfedge1+isfedge2+isfedge3+isedge4+isedge5+isedge6)342{343case 0:344{345if (!fp1 && !ep2 && !ep3 && !ep4)346type = HP_TET_1F_0E_0V;347if (fp1 && !ep2 && !ep3 && !ep4)348type = HP_TET_1F_0E_1VB;349if (!fp1 && ep2 && !ep3 & !ep4)350type = HP_TET_1F_0E_1VA;351break;352}353case 1:354{355if (isfedge1)356{357if (!ep1 && !ep3 && !ep4)358type = HP_TET_1F_1EA_0V;359}360if (isedge4) // V1-V3361{362if (!ep1 && !cp2 && !cp3 && !ep4)363type = HP_TET_1F_1EB_0V;364}365break;366}367}368break;369}370371372case 2: // two singular faces373{374if (!isface1 || !isface2) break;375376switch (isfedge1+isedge2+isedge3+isedge4+isedge5)377{378case 0:379{380if (!ep1 && !ep2 && !cp3 && !cp4)381type = HP_TET_2F_0E_0V;382break;383}384}385break;386}387388389}390391if (type != HP_NONE)392{393int pnums[4];394pnums[0] = el.pnums[j];395pnums[1] = el.pnums[k];396pnums[2] = el.pnums[pi3];397pnums[3] = el.pnums[pi4];398for(k=0;k<4;k++) el.pnums[k] = pnums[k];399break;400}401}402403404if (debug) cout << "type = " << type << endl;405406if (type == HP_NONE)407{408// cnt_undef++;409(*testout) << "undefined element" << endl410<< "cp = " << cp1 << cp2 << cp3 << cp4 << endl411<< "ep = " << ep1 << ep2 << ep3 << ep4 << endl412<< "isedge = " << isedge1 << isedge2 << isedge3413<< isedge4 << isedge5 << isedge6 << endl414<< "isface = " << isface1 << isface2 << isface3 << isface4 << endl;415cout << "undefined element !!! " << endl;416417418}419return(type);420}421422423424HPREF_ELEMENT_TYPE ClassifyPrism(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,425BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,426INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)427{428429HPREF_ELEMENT_TYPE type = HP_NONE;430431int p[6];432for(int m=1;m<=6;m++)433{434int point_sing[6]={0,0,0,0,0,0};435int face_sing[5]={0,0,0,0,0};436int edge_sing[9]={0,0,0,0,0,0,0,0,0};437438if(m<4)439{440p[0]= m; p[1]=m%3+1; p[2]=(m%3+1)%3+1;441for(int l=3;l<6;l++) p[l]=p[l-3]+3;442}443else444{445p[0] = m; p[1]=(m%3+1)%3+4; p[2]=m%3+4;446for(int l=3;l<6;l++) p[l]=p[l-3]-3;447}448449for(int j=0;j<6;j++)450{451if(cornerpoint.Test(el.PNum(p[j]))) { point_sing[p[j]-1]=3;}452else if(edgepoint.Test(el.PNum(p[j]))) point_sing[p[j]-1]=2;453else if (facepoint[el.PNum(p[j])] == -1 || facepoint[el.PNum(p[j])] == el.GetIndex())454point_sing[p[j]-1] = 1;455}456457const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (PRISM);458for(int k=0;k<9;k++)459{460INDEX_2 i2 = INDEX_2 :: Sort(el.PNum(p[eledges[k][0]-1]),el.PNum(p[eledges[k][1]-1]));461if (edges.Used(i2)) edge_sing[k] = 2;462else edge_sing[k] = face_edges.Used(i2);463}464465const ELEMENT_FACE * elfaces = MeshTopology::GetFaces (PRISM);466for (int k=0;k<5;k++)467{468INDEX_3 i3;469470if(k<2)471i3 = INDEX_3::Sort(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1],472el.pnums[p[elfaces[k][2]-1]-1]);473else474{475INDEX_4 i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1], el.pnums[p[elfaces[k][2]-1]-1],el.pnums[p[elfaces[k][3]-1]-1]);476i4.Sort();477i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());478}479480if (faces.Used (i3))481{482int domnr = faces.Get(i3);483if (domnr == -1 || domnr == el.GetIndex())484face_sing[k] = 1;485486}487}488if (face_sing[1] > face_sing[0]) {m=m+2; continue;}489490491//int cp = 0;492493int qfsing = face_sing[2] + face_sing[3] + face_sing[4];494int tfsing = face_sing[0] + face_sing[1];495int evsing = edge_sing[6] + edge_sing[7] + edge_sing[8];496int ehsing = edge_sing[0] + edge_sing[1] + edge_sing[2] + edge_sing[3] + edge_sing[4] + edge_sing[5];497498if (qfsing + tfsing + evsing + ehsing == 0)499{ type = HP_PRISM; break;}500501HPREF_ELEMENT_TYPE types[] = {HP_NONE,HP_NONE,HP_NONE};502503int fb = (1-face_sing[4])* face_sing[3] * (face_sing[2] + face_sing[3]) + 3*face_sing[4]*face_sing[3]*face_sing[2];504int sve[3] = {edge_sing[7] , edge_sing[8], edge_sing[6]};505506507if(fb!=qfsing) continue;508509510switch(fb)511{512case 0:513if (evsing == 0 && ehsing==3*tfsing)514{515types[0] = HP_PRISM;516types[1] = HP_PRISM_1FA_0E_0V;517types[2] = HP_PRISM_2FA_0E_0V;518}519if(evsing > 0 && sve[0] == evsing) // 1 vertical edge 1-4520{521types[0] = HP_PRISM_SINGEDGE;522types[1] = HP_PRISM_1FA_1E_0V;523types[2] = HP_PRISM_2FA_1E_0V;524}525526if(sve[0] > 0 && sve[1] > 0 && sve[2] == 0)527{528types[0] = HP_PRISM_SINGEDGE_V12;529types[1] = HP_PRISM_1FA_2E_0V;530types[2] = HP_PRISM_2FA_2E_0V;531}532if(sve[0] > 0 && sve[1] > 0 && sve[2] > 0)533{534types[0] = HP_PRISM_3E_0V;535types[1] = HP_PRISM_1FA_3E_0V;536types[2] = HP_PRISM_2FA_3E_0V;537538if ( edge_sing[0] > 1 && edge_sing[2] > 1 &&539edge_sing[4] > 1 && edge_sing[5] > 1 && tfsing==0)540types[0] = HP_PRISM_3E_4EH;541}542543break;544case 1:545if(sve[0] <= 1 && sve[1] <= 1)546if(sve[2]==0)547{548types[0] = HP_PRISM_1FB_0E_0V;549types[1] = HP_PRISM_1FA_1FB_0E_0V;550types[2] = HP_PRISM_2FA_1FB_0E_0V;551}552else553{554types[0] = HP_PRISM_1FB_1EC_0V;555types[1] = HP_PRISM_1FA_1FB_1EC_0V;556types[2] = HP_PRISM_2FA_1FB_1EC_0V;557}558559if(sve[0] > 1 && sve[2] >= 1 && sve[1] <= 1)560{561types[0] = HP_PRISM_1FB_2EB_0V;562types[1] = HP_PRISM_1FA_1FB_2EB_0V;563types[2] = HP_PRISM_2FA_1FB_2EB_0V;564}565566if(sve[0] > 1 && sve[1] <= 1 && sve[2] == 0) // ea && !eb567{568types[0] = HP_PRISM_1FB_1EA_0V;569types[1] = HP_PRISM_1FA_1FB_1EA_0V;570types[2] = HP_PRISM_2FA_1FB_1EA_0V;571}572573if(sve[0] <= 1 && sve[1] > 1 && sve[2] == 0)574types[1] = HP_PRISM_1FA_1FB_1EB_0V;575576if(sve[0] > 1 && sve[1]>1)577if(sve[2] == 0) // ea && eb578{579types[0] = HP_PRISM_1FB_2EA_0V;580types[1] = HP_PRISM_1FA_1FB_2EA_0V;581types[2] = HP_PRISM_2FA_1FB_2EA_0V;582}583if(sve[0] <= 1 && sve[1] > 1 && sve[2] >0)584types[1] = HP_PRISM_1FA_1FB_2EC_0V;585586if(sve[0] > 1 && sve[1] > 1 && sve[2] >= 1) //sve[2] can also be a face-edge587{588types[0] = HP_PRISM_1FB_3E_0V;589types[1] = HP_PRISM_1FA_1FB_3E_0V;590types[2] = HP_PRISM_2FA_1FB_3E_0V;591}592593break;594595case 2:596if(sve[0] <= 1)597cout << " **** WARNING: Edge between to different singular faces should be marked singular " << endl;598599if(sve[1] <= 1)600if(sve[2] <=1)601{602types[0] = HP_PRISM_2FB_0E_0V;603types[1] = HP_PRISM_1FA_2FB_0E_0V;604types[2] = HP_PRISM_2FA_2FB_0E_0V;605}606else607{608types[0] = HP_PRISM_2FB_1EC_0V;609types[1] = HP_PRISM_1FA_2FB_1EC_0V;610types[2] = HP_PRISM_2FA_2FB_1EC_0V;611}612else613if(sve[2] <= 1)614types[1] = HP_PRISM_1FA_2FB_1EB_0V;615else616{617types[0] = HP_PRISM_2FB_3E_0V;618types[1] = HP_PRISM_1FA_2FB_3E_0V;619types[2] = HP_PRISM_2FA_2FB_3E_0V;620}621622break;623624case 3:625types[0] = HP_PRISM_3FB_0V;626types[1] = HP_PRISM_1FA_3FB_0V;627types[2] = HP_PRISM_2FA_3FB_0V;628break;629}630type = types[tfsing];631632633if(type != HP_NONE)634break;635}636637/*638*testout << " Prism with pnums " << endl;639for(int j=0;j<6;j++) *testout << el.pnums[j] << "\t";640*testout << endl;641*/642643if(type != HP_NONE)644{645int pnums[6];646for(int j=0;j<6;j++) pnums[j] = el.PNum (p[j]);647for(int k=0;k<6;k++) el.pnums[k] = pnums[k];648}649650/* *testout << " Classified Prism with pnums " << endl;651for(int j=0;j<6;j++) *testout << el.pnums[j] << "\t";652*testout << endl;653*/654return(type);655}656657658// #ifdef SABINE659HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,660BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,661INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)662663{664HPREF_ELEMENT_TYPE type = HP_NONE;665666int pnums[3];667int p[3];668669INDEX_3 i3 (el.pnums[0], el.pnums[1], el.pnums[2]);670i3.Sort();671bool sing_face = faces.Used (i3);672673// *testout << " facepoint " << facepoint << endl;674675676// Try all rotations of the trig677for (int j=0;j<3;j++)678{679int point_sing[3] = {0,0,0};680int edge_sing[3] = {0,0,0};681// *testout << " actual rotation of trig points " ;682for(int m=0;m<3;m++)683{684p[m] = (j+m)%3 +1; // local vertex number685pnums[m] = el.PNum(p[m]); // global vertex number686// *testout << pnums[m] << " \t ";687}688// *testout << endl ;689690if(dim == 3)691{692// face point693for(int k=0;k<3;k++)694if(!sing_face)695{696// *testout << " fp [" << k << "] = " << facepoint[pnums[k]] << endl;697// *testout << " fd.DomainIn()" << fd.DomainIn() << endl;698// *testout << " fd.DomainOut()" << fd.DomainOut() << endl;699if( facepoint[pnums[k]] && (facepoint[pnums[k]] ==-1 ||700facepoint[pnums[k]] == fd.DomainIn() || facepoint[pnums[k]] == fd.DomainOut()))701point_sing[p[k]-1] = 1;702}703// if point is on face_edge in next step sing = 2704705/* *testout << " pointsing NACH FACEPOints ... FALLS EDGEPOINT UMSETZEN" ;706for (int k=0;k<3;k++) *testout << "\t" << point_sing[p[k]-1] ;707*testout << endl; */708}709710const ELEMENT_EDGE * eledges = MeshTopology::GetEdges(TRIG);711712if(dim==3)713{714for(int k=0;k<3;k++)715{716int ep1=p[eledges[k][0]-1];717int ep2=p[eledges[k][1]-1];718INDEX_2 i2(el.PNum(ep1),el.PNum(ep2));719720if(edges.Used(i2))721{722723edge_sing[k]=2;724point_sing[ep1-1] = 2;725point_sing[ep2-1] = 2;726}727else // face_edge?728{729i2.Sort();730if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1) // edge not face_edge acc. to surface in which trig lies731if(face_edges.Get(i2)==-1 ||face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut() )732{733edge_sing[k]=1;734}735else736{737point_sing[ep1-1] = 0; // set to edge_point738point_sing[ep2-1] = 0; // set to edge_point739}740}741742/* *testout << " pointsing NACH edges UND FACEEDGES UMSETZEN ... " ;743for (int k=0;k<3;k++) *testout << "\t" << point_sing[p[k]-1] ;744*testout << endl;745*/746}747}748/*749*testout << " dim " << dim << endl;750*testout << " edgepoint_dom " << edgepoint_dom << endl;751*/752if(dim==2)753{754for(int k=0;k<3;k++)755{756int ep1=p[eledges[k][0]-1];757int ep2=p[eledges[k][1]-1];758759INDEX_2 i2(el.PNum(ep1),el.PNum(ep2));760761if(edges.Used(i2))762{763764if(edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[ep1-1])) ||765edgepoint_dom.Used(INDEX_2(-1,pnums[ep1-1])) ||766edgepoint_dom.Used(INDEX_2(fd.SurfNr(),pnums[ep2-1])) ||767edgepoint_dom.Used(INDEX_2(-1,pnums[ep2-1])))768{769edge_sing[k]=2;770point_sing[ep1-1] = 2;771point_sing[ep2-1] = 2;772}773}774775}776}777778779780for(int k=0;k<3;k++)781if(edgepoint.Test(pnums[k])) //edgepoint, but not member of sing_edge on trig -> cp782{783INDEX_2 i2a=INDEX_2::Sort(el.PNum(p[k]), el.PNum(p[(k+1)%3]));784INDEX_2 i2b=INDEX_2::Sort(el.PNum(p[k]), el.PNum(p[(k+2)%3]));785786if(!edges.Used(i2a) && !edges.Used(i2b))787point_sing[p[k]-1] = 3;788}789790for(int k=0;k<3;k++)791if(cornerpoint.Test(el.PNum(p[k])))792point_sing[p[k]-1] = 3;793794795if(edge_sing[0] + edge_sing[1] + edge_sing[2] == 0)796{797int ps = point_sing[0] + point_sing[1] + point_sing[2];798799if(ps==0)800type = HP_TRIG;801else if(point_sing[p[0]-1] && !point_sing[p[1]-1] && !point_sing[p[2]-1])802type = HP_TRIG_SINGCORNER;803else if(point_sing[p[0]-1] && point_sing[p[1]-1] && !point_sing[p[2]-1])804type = HP_TRIG_SINGCORNER12;805else if(point_sing[p[0]-1] && point_sing[p[1]-1] && point_sing[p[2]-1])806{807if(dim==2) type = HP_TRIG_SINGCORNER123_2D;808else type = HP_TRIG_SINGCORNER123;809}810}811else812if (edge_sing[2] && !edge_sing[0] && !edge_sing[1]) //E[2]=(1,2)813{814int code = 0;815if(point_sing[p[0]-1] > edge_sing[2]) code+=1;816if(point_sing[p[1]-1] > edge_sing[2]) code+=2;817if(point_sing[p[2]-1]) code+=4;818819HPREF_ELEMENT_TYPE types[] =820{821HP_TRIG_SINGEDGE,822HP_TRIG_SINGEDGECORNER1,823HP_TRIG_SINGEDGECORNER2,824HP_TRIG_SINGEDGECORNER12,825HP_TRIG_SINGEDGECORNER3,826HP_TRIG_SINGEDGECORNER13,827HP_TRIG_SINGEDGECORNER23,828HP_TRIG_SINGEDGECORNER123,829};830type = types[code];831832} // E[0] = [0,2], E[1] =[1,2], E[2] = [0,1]833else834if(edge_sing[2] && !edge_sing[1] && edge_sing[0])835{836if(point_sing[p[2]-1] <= edge_sing[0] )837{838if(point_sing[p[1]-1]<= edge_sing[2]) type = HP_TRIG_SINGEDGES;839else type = HP_TRIG_SINGEDGES2;840}841else842{843if(point_sing[p[1]-1]<= edge_sing[2])844type = HP_TRIG_SINGEDGES3;845else type = HP_TRIG_SINGEDGES23;846}847}848else if (edge_sing[2] && edge_sing[1] && edge_sing[0])849type = HP_TRIG_3SINGEDGES;850851// cout << " run for " << j << " gives type " << type << endl;852//*testout << " run for " << j << " gives type " << type << endl;853if(type!=HP_NONE) break;854}855856for(int k=0;k<3;k++) el[k] = pnums[k];857/*if(type != HP_NONE)858{859860cout << " TRIG with pnums " << pnums[0] << "\t" <<861pnums[1] << "\t" << pnums[2] << endl;862cout << " type " << type << endl;863}864*/865return(type);866}867#ifdef HPREF_OLD868HPREF_ELEMENT_TYPE ClassifyTrig(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,869BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,870INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)871{872HPREF_ELEMENT_TYPE type = HP_NONE;873874int pnums[3];875876INDEX_3 i3 (el.pnums[0], el.pnums[1], el.pnums[2]);877i3.Sort();878bool sing_face = faces.Used (i3);879880881for (int j = 1; j <= 3; j++)882{883int ep1 = edgepoint.Test (el.PNumMod (j));884int ep2 = edgepoint.Test (el.PNumMod (j+1));885int ep3 = edgepoint.Test (el.PNumMod (j+2));886887if (dim == 2)888{889// JS, Dec 11890ep1 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j))) ||891edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j)));892ep2 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j+1))) ||893edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j+1)));894ep3 = edgepoint_dom.Used (INDEX_2 (fd.SurfNr(), el.PNumMod(j+2))) ||895edgepoint_dom.Used (INDEX_2 (-1, el.PNumMod(j+2)));896/*897ep1 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j)));898ep2 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j+1)));899ep3 = edgepoint_dom.Used (INDEX_2 (el.index, el.PNumMod(j+2)));900*/901// ep3 = edgepoint_dom.Used (INDEX_2 (mesh.SurfaceElement(i).GetIndex(), el.PNumMod(j+2)));902}903904905906int cp1 = cornerpoint.Test (el.PNumMod (j));907int cp2 = cornerpoint.Test (el.PNumMod (j+1));908int cp3 = cornerpoint.Test (el.PNumMod (j+2));909910ep1 |= cp1;911ep2 |= cp2;912ep3 |= cp3;913914915// (*testout) << "cp = " << cp1 << cp2 << cp3 << ", ep = " << ep1 << ep2 << ep3 << endl;916917int p[3] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2)};918if(ep1)919{920INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]);921INDEX_2 i2b=INDEX_2::Sort(p[0], p[2]);922if(!edges.Used(i2a) && !edges.Used(i2b))923cp1 = 1;924}925if(ep2)926{927INDEX_2 i2a=INDEX_2::Sort(p[1], p[0]);928INDEX_2 i2b=INDEX_2::Sort(p[1], p[2]);929if(!edges.Used(i2a) && !edges.Used(i2b))930cp2 = 1;931}932if(ep3)933{934INDEX_2 i2a=INDEX_2::Sort(p[2], p[0]);935INDEX_2 i2b=INDEX_2::Sort(p[2], p[1]);936if(!edges.Used(i2a) && !edges.Used(i2b))937cp3= 1;938}939940941int isedge1=0, isedge2=0, isedge3=0;942if(dim == 3 )943{944INDEX_2 i2;945i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));946isedge1 = edges.Used (i2);947i2.Sort();948if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&949(face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )950{951isedge1=1;952ep1 = 1; ep2=1;953}954955i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));956isedge2 = edges.Used (i2);957i2.Sort();958if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&959(face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )960{961isedge2=1;962ep2 = 1; ep3=1;963}964i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));965isedge3 = edges.Used (i2);966i2.Sort();967if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&968(face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )969{970isedge3=1;971ep1 = 1; ep3=1;972}973974// cout << " isedge " << isedge1 << " \t " << isedge2 << " \t " << isedge3 << endl;975976if (!sing_face)977{978/*979if (!isedge1) { cp1 |= ep1; cp2 |= ep2; }980if (!isedge2) { cp2 |= ep2; cp3 |= ep3; }981if (!isedge3) { cp3 |= ep3; cp1 |= ep1; }982*/983ep1 |= facepoint [el.PNumMod(j)] != 0;984ep2 |= facepoint [el.PNumMod(j+1)] != 0;985ep3 |= facepoint [el.PNumMod(j+2)] != 0;986987988isedge1 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j), el.PNumMod(j+1)));989isedge2 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j+1), el.PNumMod(j+2)));990isedge3 |= face_edges.Used (INDEX_2::Sort (el.PNumMod(j+2), el.PNumMod(j+3)));991}992}993994if(dim ==2)995{996INDEX_2 i2;997i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));998i2.Sort();999isedge1 = edges.Used (i2);1000if(isedge1)1001{1002ep1 = 1; ep2=1;1003}10041005i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));1006i2.Sort();1007isedge2 = edges.Used (i2);1008if(isedge2)1009{1010ep2 = 1; ep3=1;1011}1012i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));1013i2.Sort();1014isedge3 = edges.Used (i2);1015if(isedge3)1016{1017ep1 = 1; ep3=1;1018}101910201021}102210231024/*1025cout << " used " << face_edges.Used (INDEX_2::Sort (el.PNumMod(j), el.PNumMod(j+1))) << endl;10261027cout << " isedge " << isedge1 << " \t " << isedge2 << " \t " << isedge3 << endl;1028cout << " ep " << ep1 << "\t" << ep2 << " \t " << ep3 << endl;1029cout << " cp " << cp1 << "\t" << cp2 << " \t " << cp3 << endl;1030*/1031103210331034if (isedge1 + isedge2 + isedge3 == 0)1035{1036if (!ep1 && !ep2 && !ep3)1037type = HP_TRIG;10381039if (ep1 && !ep2 && !ep3)1040type = HP_TRIG_SINGCORNER;10411042if (ep1 && ep2 && !ep3)1043type = HP_TRIG_SINGCORNER12;10441045if (ep1 && ep2 && ep3)1046{1047if (dim == 2)1048type = HP_TRIG_SINGCORNER123_2D;1049else1050type = HP_TRIG_SINGCORNER123;1051}10521053if (type != HP_NONE)1054{1055pnums[0] = el.PNumMod (j);1056pnums[1] = el.PNumMod (j+1);1057pnums[2] = el.PNumMod (j+2);1058break;1059}1060}10611062if (isedge1 && !isedge2 && !isedge3)1063{1064int code = 0;1065if (cp1) code += 1;1066if (cp2) code += 2;1067if (ep3) code += 4;10681069HPREF_ELEMENT_TYPE types[] =1070{1071HP_TRIG_SINGEDGE,1072HP_TRIG_SINGEDGECORNER1,1073HP_TRIG_SINGEDGECORNER2,1074HP_TRIG_SINGEDGECORNER12,1075HP_TRIG_SINGEDGECORNER3,1076HP_TRIG_SINGEDGECORNER13,1077HP_TRIG_SINGEDGECORNER23,1078HP_TRIG_SINGEDGECORNER123,1079};1080type = types[code];1081pnums[0] = el.PNumMod (j);1082pnums[1] = el.PNumMod (j+1);1083pnums[2] = el.PNumMod (j+2);1084break;1085}108610871088if (isedge1 && !isedge2 && isedge3)1089{1090if (!cp3)1091{1092if (!cp2) type = HP_TRIG_SINGEDGES;1093else type = HP_TRIG_SINGEDGES2;1094}1095else1096{1097if (!cp2) type = HP_TRIG_SINGEDGES3;1098else type = HP_TRIG_SINGEDGES23;1099}11001101pnums[0] = el.PNumMod (j);1102pnums[1] = el.PNumMod (j+1);1103pnums[2] = el.PNumMod (j+2);1104break;1105}11061107if (isedge1 && isedge2 && isedge3)1108{1109type = HP_TRIG_3SINGEDGES;1110pnums[0] = el.PNumMod (j);1111pnums[1] = el.PNumMod (j+1);1112pnums[2] = el.PNumMod (j+2);1113break;1114}1115}11161117for(int k=0;k<3;k++) el[k] = pnums[k];1118/*if(type != HP_NONE)1119{11201121cout << " TRIG with pnums " << pnums[0] << "\t" <<1122pnums[1] << "\t" << pnums[2] << endl;1123cout << " type " << type << endl;1124}1125*/1126return(type);1127}1128#endif1129HPREF_ELEMENT_TYPE ClassifyQuad(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,1130BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,1131INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint, int dim, const FaceDescriptor & fd)1132{1133HPREF_ELEMENT_TYPE type = HP_NONE;11341135int ep1(-1), ep2(-1), ep3(-1), ep4(-1), cp1(-1), cp2(-1), cp3(-1), cp4(-1);1136int isedge1, isedge2, isedge3, isedge4;11371138for (int j = 1; j <= 4; j++)1139{1140ep1 = edgepoint.Test (el.PNumMod (j));1141ep2 = edgepoint.Test (el.PNumMod (j+1));1142ep3 = edgepoint.Test (el.PNumMod (j+2));1143ep4 = edgepoint.Test (el.PNumMod (j+3));11441145if (dim == 2)1146{1147ep1 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j)));1148ep2 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j+1)));1149ep3 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j+2)));1150ep4 = edgepoint_dom.Used (INDEX_2 (el.GetIndex(), el.PNumMod(j+3)));1151}11521153cp1 = cornerpoint.Test (el.PNumMod (j));1154cp2 = cornerpoint.Test (el.PNumMod (j+1));1155cp3 = cornerpoint.Test (el.PNumMod (j+2));1156cp4 = cornerpoint.Test (el.PNumMod (j+3));11571158ep1 |= cp1;1159ep2 |= cp2;1160ep3 |= cp3;1161ep4 |= cp4;11621163int p[4] = { el.PNumMod (j), el.PNumMod (j+1), el.PNumMod (j+2), el.PNumMod(j+4)};1164//int epp[4] = { ep1, ep2, ep3, ep4};1165int cpp[4] = { cp1, cp2, cp3, cp4};1166for(int k=0;k<0;k++)1167{1168INDEX_2 i2a=INDEX_2::Sort(p[k], p[(k+1)%4]);1169INDEX_2 i2b=INDEX_2::Sort(p[k], p[(k-1)%4]);1170if(!edges.Used(i2a) && !edges.Used(i2b))1171cpp[k] = 1;1172}1173cp1= cpp[0]; cp2=cpp[1]; cp3=cpp[2]; cp4=cpp[3];117411751176if(dim ==3)1177{1178INDEX_2 i2;1179i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));1180// i2.Sort();1181isedge1 = edges.Used (i2);1182i2.Sort();1183if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&1184(face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )1185{1186isedge1=1;1187ep1 = 1; ep2=1;1188}1189i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));1190// i2.Sort();1191isedge2 = edges.Used (i2);1192i2.Sort();1193if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&1194(face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )1195{1196isedge2=1;1197ep2=1; ep3=1;1198}1199i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));1200// i2.Sort();1201isedge3 = edges.Used (i2);1202i2.Sort();1203if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 && (face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )1204{1205isedge3=1;1206ep3=1; ep4=1;1207}1208i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));1209// i2.Sort();1210isedge4 = edges.Used (i2);1211i2.Sort();1212if(surf_edges.Used(i2) && surf_edges.Get(i2) != fd.SurfNr()+1 &&1213(face_edges.Get(i2) == -1 || face_edges.Get(i2) == fd.DomainIn() || face_edges.Get(i2) == fd.DomainOut()) )1214{1215isedge4=1;1216ep4=1; ep1=1;1217}121812191220//MH***********************************************************************************************************1221if(ep1)1222if(edgepoint.Test(p[0]))1223{1224INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]);1225INDEX_2 i2b=INDEX_2::Sort(p[0], p[3]);1226if(!edges.Used(i2a) && !edges.Used(i2b))1227cp1 = 1;1228}1229if(ep2)1230if(edgepoint.Test(p[1]))1231{1232INDEX_2 i2a=INDEX_2::Sort(p[0], p[1]);1233INDEX_2 i2b=INDEX_2::Sort(p[1], p[2]);1234if(!edges.Used(i2a) && !edges.Used(i2b))1235cp2 = 1;1236}1237if(ep3)1238if(edgepoint.Test(p[2]))1239{1240INDEX_2 i2a=INDEX_2::Sort(p[2], p[1]);1241INDEX_2 i2b=INDEX_2::Sort(p[3], p[2]);1242if(!edges.Used(i2a) && !edges.Used(i2b))1243cp3 = 1;1244}1245if(ep4)1246if(edgepoint.Test(p[3]))1247{1248INDEX_2 i2a=INDEX_2::Sort(p[0], p[3]);1249INDEX_2 i2b=INDEX_2::Sort(p[3], p[2]);1250if(!edges.Used(i2a) && !edges.Used(i2b))1251cp4 = 1;1252}1253//MH*****************************************************************************************************************************1254}1255else1256{1257INDEX_2 i2;1258i2 = INDEX_2(el.PNumMod (j), el.PNumMod (j+1));1259i2.Sort();1260isedge1 = edges.Used (i2);1261if(isedge1)1262{1263ep1 = 1; ep2=1;1264}1265i2 = INDEX_2(el.PNumMod (j+1), el.PNumMod (j+2));1266i2.Sort();1267isedge2 = edges.Used (i2);1268if(isedge2)1269{1270ep2=1; ep3=1;1271}1272i2 = INDEX_2(el.PNumMod (j+2), el.PNumMod (j+3));1273i2.Sort();1274isedge3 = edges.Used (i2);12751276if(isedge3)1277{1278ep3=1; ep4=1;1279}1280i2 = INDEX_2(el.PNumMod (j+3), el.PNumMod (j+4));1281i2.Sort();1282isedge4 = edges.Used (i2);1283if(isedge4)1284{1285ep4=1; ep1=1;1286}1287}12881289int sumcp = cp1 + cp2 + cp3 + cp4;1290int sumep = ep1 + ep2 + ep3 + ep4;1291int sumedge = isedge1 + isedge2 + isedge3 + isedge4;12921293switch (sumedge)1294{1295case 0:1296{1297switch (sumep)1298{1299case 0:1300type = HP_QUAD;1301break;1302case 1:1303if (ep1) type = HP_QUAD_SINGCORNER;1304break;1305case 2:1306{1307if (ep1 && ep2) type = HP_QUAD_0E_2VA;1308if (ep1 && ep3) type = HP_QUAD_0E_2VB;1309break;1310}1311case 3:1312if (!ep4) type = HP_QUAD_0E_3V;1313break;1314case 4:1315type = HP_QUAD_0E_4V;1316break;1317}1318break;1319}1320case 1:1321{1322if (isedge1)1323{1324switch (cp1+cp2+ep3+ep4)1325{1326case 0:1327type = HP_QUAD_SINGEDGE;1328break;1329case 1:1330{1331if (cp1) type = HP_QUAD_1E_1VA;1332if (cp2) type = HP_QUAD_1E_1VB;1333if (ep3) type = HP_QUAD_1E_1VC;1334if (ep4) type = HP_QUAD_1E_1VD;1335break;1336}1337case 2:1338{1339if (cp1 && cp2) type = HP_QUAD_1E_2VA;1340if (cp1 && ep3) type = HP_QUAD_1E_2VB;1341if (cp1 && ep4) type = HP_QUAD_1E_2VC;1342if (cp2 && ep3) type = HP_QUAD_1E_2VD;1343if (cp2 && ep4) type = HP_QUAD_1E_2VE;1344if (ep3 && ep4) type = HP_QUAD_1E_2VF;1345break;1346}1347case 3:1348{1349if (cp1 && cp2 && ep3) type = HP_QUAD_1E_3VA;1350if (cp1 && cp2 && ep4) type = HP_QUAD_1E_3VB;1351if (cp1 && ep3 && ep4) type = HP_QUAD_1E_3VC;1352if (cp2 && ep3 && ep4) type = HP_QUAD_1E_3VD;1353break;1354}1355case 4:1356{1357type = HP_QUAD_1E_4V;1358break;1359}1360}1361}1362break;1363}1364case 2:1365{1366if (isedge1 && isedge4)1367{1368if (!cp2 && !ep3 && !cp4)1369type = HP_QUAD_2E;13701371if (cp2 && !ep3 && !cp4)1372type = HP_QUAD_2E_1VA;1373if (!cp2 && ep3 && !cp4)1374type = HP_QUAD_2E_1VB;1375if (!cp2 && !ep3 && cp4)1376type = HP_QUAD_2E_1VC;13771378if (cp2 && ep3 && !cp4)1379type = HP_QUAD_2E_2VA;1380if (cp2 && !ep3 && cp4)1381type = HP_QUAD_2E_2VB;1382if (!cp2 && ep3 && cp4)1383type = HP_QUAD_2E_2VC;13841385if (cp2 && ep3 && cp4)1386type = HP_QUAD_2E_3V;1387}1388if (isedge1 && isedge3)1389{1390switch (sumcp)1391{1392case 0:1393type = HP_QUAD_2EB_0V; break;1394case 1:1395{1396if (cp1) type = HP_QUAD_2EB_1VA;1397if (cp2) type = HP_QUAD_2EB_1VB;1398break;1399}1400case 2:1401{1402if (cp1 && cp2) { type = HP_QUAD_2EB_2VA; }1403if (cp1 && cp3) { type = HP_QUAD_2EB_2VB; }1404if (cp1 && cp4) { type = HP_QUAD_2EB_2VC; }1405if (cp2 && cp4) { type = HP_QUAD_2EB_2VD; }1406break;1407}1408case 3:1409{1410if (cp1 && cp2 && cp3) { type = HP_QUAD_2EB_3VA; }1411if (cp1 && cp2 && cp4) { type = HP_QUAD_2EB_3VB; }1412break;1413}1414case 4:1415{1416type = HP_QUAD_2EB_4V; break;1417}1418}1419}1420break;1421}14221423case 3:1424{1425if (isedge1 && isedge2 && isedge4)1426{1427if (!cp3 && !cp4) type = HP_QUAD_3E;1428if (cp3 && !cp4) type = HP_QUAD_3E_3VA;1429if (!cp3 && cp4) type = HP_QUAD_3E_3VB;1430if (cp3 && cp4) type = HP_QUAD_3E_4V;1431}1432break;1433}14341435case 4:1436{1437type = HP_QUAD_4E;1438break;1439}1440}14411442if (type != HP_NONE)1443{1444int pnums[4];1445pnums[0] = el.PNumMod (j);1446pnums[1] = el.PNumMod (j+1);1447pnums[2] = el.PNumMod (j+2);1448pnums[3] = el.PNumMod (j+3);1449for (int k=0;k<4;k++) el[k] = pnums[k];14501451/* cout << " QUAD with pnums " << pnums[0] << "\t" <<1452pnums[1] << "\t" << pnums[2] << "\t" << pnums[3]1453<< endl << " of type " << type << endl; */14541455break;1456}1457}1458if (type == HP_NONE)1459{1460(*testout) << "undefined element" << endl1461<< "cp = " << cp1 << cp2 << cp3 << cp4 << endl1462<< "ep = " << ep1 << ep2 << ep3 << ep4 << endl1463<< "isedge = " << isedge1 << isedge2 << isedge31464<< isedge4 << endl;1465}146614671468return(type);1469}147014711472HPREF_ELEMENT_TYPE ClassifyHex(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,1473BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,1474INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)1475{1476HPREF_ELEMENT_TYPE type = HP_NONE;14771478// implementation only for HP_HEX_1F_0E_0V1479// HP_HEX_1FA_1FB_0E_0V1480// HP_HEX1481// up to now other cases are refine dummies14821483// indices of bot,top-faces combinations1484int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}};1485int p[8];1486const ELEMENT_FACE * elfaces = MeshTopology::GetFaces (HEX);1487const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (HEX);14881489for(int m=0;m<6 && type == HP_NONE;m++)1490for(int j=0;j<4 && type == HP_NONE;j++)1491{1492int point_sing[8]={0,0,0,0,0,0,0,0};1493int face_sing[6] = {0,0,0,0,0,0};1494int edge_sing[12] = {0,0,0,0,0,0,0,0,0,0,0,0};1495int spoint=0, sface=0, sedge=0;1496for(int l=0;l<4;l++)1497{1498p[l] = elfaces[index[m][0]][(4-j-l)%4];1499p[l+4] = elfaces[index[m][1]][(j+l)%4];1500}15011502for(int l=0;l<8;l++)1503if(cornerpoint.Test(el.PNum(p[l])))1504{1505point_sing[p[l]-1]=3;1506spoint++;1507}1508else if(edgepoint.Test(el.PNum(p[l]))) point_sing[p[l]-1]=2;1509else if (facepoint[el.PNum(p[l])] == -1 || facepoint[el.PNum(p[l])] == el.GetIndex())1510point_sing[p[l]-1] = 1;15111512for(int k=0;k<12;k++)1513{1514INDEX_2 i2 = INDEX_2 :: Sort(el.PNum(p[eledges[k][0]-1]),el.PNum(p[eledges[k][1]-1]));1515if (edges.Used(i2))1516{1517edge_sing[k] = 2;1518sedge++;1519}1520else edge_sing[k] = face_edges.Used(i2);1521}15221523for (int k=0;k<6;k++)1524{1525INDEX_3 i3;152615271528INDEX_4 i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]-1], el.pnums[p[elfaces[k][1]-1]-1], el.pnums[p[elfaces[k][2]-1]-1],el.pnums[p[elfaces[k][3]-1]-1]);1529i4.Sort();1530i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());15311532if (faces.Used (i3))1533{15341535int domnr = faces.Get(i3);1536if (domnr == -1 || domnr == el.GetIndex())1537{1538face_sing[k] = 1;1539sface++;1540}15411542}1543}15441545if(!sface && !sedge && !spoint) type = HP_HEX;1546if(!sedge && !spoint)1547{1548if(face_sing[0] && face_sing[2] && sface==2)1549type = HP_HEX_1FA_1FB_0E_0V;1550if (face_sing[0] && sface==1)1551type = HP_HEX_1F_0E_0V;1552}15531554el.type=type;15551556if(type != HP_NONE)1557{1558int pnums[8];1559for(int l=0;l<8;l++) pnums[l] = el[p[l]-1];1560for(int l=0;l<8;l++) el[l] = pnums[l];1561/* cout << " HEX with pnums " << pnums[0] << "\t" <<1562pnums[1] << "\t" << pnums[2] << "\t" << pnums[3] << "\t" <<1563pnums[4] << "\t" << pnums[5] << endl << " of type " << type << endl; */1564break;1565}1566}15671568return (type);15691570}15711572HPREF_ELEMENT_TYPE ClassifySegm(HPRefElement & hpel, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,1573BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,1574INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)1575{15761577int cp1 = cornerpoint.Test (hpel[0]);1578int cp2 = cornerpoint.Test (hpel[1]);15791580INDEX_2 i2;1581i2 = INDEX_2(hpel[0], hpel[1]);1582i2.Sort();1583if (!edges.Used (i2))1584{1585cp1 = edgepoint.Test (hpel[0]);1586cp2 = edgepoint.Test (hpel[1]);1587}15881589if(!edges.Used(i2) && !face_edges.Used(i2))1590{1591if(facepoint[hpel[0]]!=0) cp1=1;1592if(facepoint[hpel[1]]!=0) cp2=1;1593}15941595if(edges.Used(i2) && !face_edges.Used(i2))1596{1597if(facepoint[hpel[0]]) cp1 = 1;1598if(facepoint[hpel[1]]) cp2 = 1;1599}16001601if (!cp1 && !cp2)1602hpel.type = HP_SEGM;1603else if (cp1 && !cp2)1604hpel.type = HP_SEGM_SINGCORNERL;1605else if (!cp1 && cp2)1606hpel.type = HP_SEGM_SINGCORNERR;1607else1608hpel.type = HP_SEGM_SINGCORNERS;16091610// cout << " SEGM found with " << hpel[0] << " \t" << hpel[1] << endl << " of type " << hpel.type << endl;1611return(hpel.type) ;1612}161316141615HPREF_ELEMENT_TYPE ClassifyPyramid(HPRefElement & el, INDEX_2_HASHTABLE<int> & edges, INDEX_2_HASHTABLE<int> & edgepoint_dom,1616BitArray & cornerpoint, BitArray & edgepoint, INDEX_3_HASHTABLE<int> & faces, INDEX_2_HASHTABLE<int> & face_edges,1617INDEX_2_HASHTABLE<int> & surf_edges, ARRAY<int, PointIndex::BASE> & facepoint)1618{1619HPREF_ELEMENT_TYPE type = HP_NONE;16201621// implementation only for HP_PYRAMID1622// HP_PYRAMID_0E_1V1623// HP_PYRAMID_EDGES1624// HP_PYRAMID_1FB_0E_1VA1625// up to now other cases are refine dummies16261627// indices of bot,top-faces combinations1628// int index[6][2] = {{0,1},{1,0},{2,4},{4,2},{3,5},{5,3}};16291630const ELEMENT_FACE * elfaces = MeshTopology::GetFaces (PYRAMID);1631const ELEMENT_EDGE * eledges = MeshTopology::GetEdges (PYRAMID);16321633int point_sing[5]={0,0,0,0,0};1634int face_sing[5] = {0,0,0,0,0};1635int edge_sing[8] = {0,0,0,0,0,0,0,0};16361637int spoint=0, sedge=0, sface=0;16381639for(int m=0;m<4 && type == HP_NONE;m++)1640{1641int p[5] = {m%4, m%4+1, m%4+2, m%4+3, 4};16421643for(int l=0;l<5;l++)1644{1645if(cornerpoint.Test(el.pnums[p[l]]))1646point_sing[l]=3;16471648else if(edgepoint.Test(el.pnums[p[l]]))1649point_sing[l]=2;16501651else if (facepoint[el.pnums[p[l]]] == -1 || facepoint[el.pnums[p[l]]] == el.GetIndex())1652point_sing[l] = 1;16531654spoint += point_sing[l];1655}16561657for(int k=0;k<8;k++)1658{1659INDEX_2 i2 = INDEX_2 :: Sort(el.pnums[p[eledges[k][0]-1]],1660el.pnums[p[eledges[k][1]-1]]);1661if (edges.Used(i2))1662edge_sing[k] = 2;1663else1664edge_sing[k] = face_edges.Used(i2);16651666sedge += edge_sing[k];1667}16681669for (int k=0;k<5;k++)1670{1671INDEX_3 i3;1672INDEX_4 i4 = INDEX_4(el.pnums[p[elfaces[k][0]-1]], el.pnums[p[elfaces[k][1]-1]], el.pnums[p[elfaces[k][2]-1]],1673el.pnums[p[elfaces[k][3]-1]]);1674i4.Sort();1675i3 = INDEX_3(i4.I1(), i4.I2(), i4.I3());16761677if (faces.Used (i3))1678{16791680int domnr = faces.Get(i3);1681if (domnr == -1 || domnr == el.GetIndex())1682face_sing[k] = 1;1683}1684sface +=face_sing[k];1685}16861687if(!sface && !spoint && !sedge) return(HP_PYRAMID);16881689if(!sface && !sedge && point_sing[p[0]] == spoint)1690type = HP_PYRAMID_0E_1V;16911692if(!sface && edge_sing[0] + edge_sing[2] == sedge &&1693spoint == point_sing[0] + point_sing[1] + point_sing[3])1694type = HP_PYRAMID_EDGES;16951696if(sface && sface == face_sing[0] && spoint == point_sing[4] + 2)1697type = HP_PYRAMID_1FB_0E_1VA;169816991700if(type != HP_NONE)1701{1702int pnums[8];1703for(int l=0;l<5;l++) pnums[l] = el[p[l]];1704for(int l=0;l<5;l++) el[l] = pnums[l];1705el.type=type;1706break;1707}1708}17091710return (type);17111712}171317141715