Path: blob/devel/ElmerGUI/netgen/libsrc/meshing/hprefinement.hpp
3206 views
#ifndef FILE_HPREFINEMENT1#define FILE_HPREFINEMENT23/**************************************************************************/4/* File: hprefinement.hh */5/* Author: Joachim Schoeberl */6/* Date: 27. Oct. 2000 */7/**************************************************************************/89/*10HP Refinement11*/1213141516enum HPREF_ELEMENT_TYPE {17HP_NONE=0,1819HP_SEGM = 1,20HP_SEGM_SINGCORNERL,21HP_SEGM_SINGCORNERR,22HP_SEGM_SINGCORNERS,2324HP_TRIG = 10,25HP_TRIG_SINGCORNER,26HP_TRIG_SINGCORNER12,27HP_TRIG_SINGCORNER123,28HP_TRIG_SINGCORNER123_2D, // not rotational symmetric29HP_TRIG_SINGEDGE = 20,30HP_TRIG_SINGEDGECORNER1, // E = 100, V = 10031HP_TRIG_SINGEDGECORNER2, // E = 100, V = 01032HP_TRIG_SINGEDGECORNER12, // E = 100, V = 11033HP_TRIG_SINGEDGECORNER3,34HP_TRIG_SINGEDGECORNER13,35HP_TRIG_SINGEDGECORNER23,36HP_TRIG_SINGEDGECORNER123,37HP_TRIG_SINGEDGES = 30,38HP_TRIG_SINGEDGES2,39HP_TRIG_SINGEDGES3,40HP_TRIG_SINGEDGES23,41HP_TRIG_3SINGEDGES = 40,4243HP_QUAD = 50,44HP_QUAD_SINGCORNER,45HP_DUMMY_QUAD_SINGCORNER,46HP_QUAD_SINGEDGE,47HP_QUAD_0E_2VA, // V = 110048HP_QUAD_0E_2VB, // V = 101049HP_QUAD_0E_3V,50HP_QUAD_0E_4V,5152// one edge: marked edge is always edge from vertex 1 to vertex 2 (E = 1000)53HP_QUAD_1E_1VA, // vertex on beginning of edge: V = 100054HP_QUAD_1E_1VB, // vertex on end of edge: V = 010055HP_QUAD_1E_1VC, // V = 001056HP_QUAD_1E_1VD, // V = 00015758HP_QUAD_1E_2VA, // V = 110059HP_QUAD_1E_2VB, // V = 101060HP_QUAD_1E_2VC, // V = 100161HP_QUAD_1E_2VD, // V = 011062HP_QUAD_1E_2VE, // V = 010163HP_QUAD_1E_2VF, // V = 00116465HP_QUAD_1E_3VA, // V = 111066HP_QUAD_1E_3VB, // V = 110167HP_QUAD_1E_3VC, // V = 101168HP_QUAD_1E_3VD, // V = 01116970HP_QUAD_1E_4V, // V = 1111717273HP_QUAD_2E, // E = 1001, V = 100074HP_QUAD_2E_1VA, // E = 1001, V = 110075HP_QUAD_2E_1VB, // E = 1001, V = 101076HP_QUAD_2E_1VC, // E = 1001, V = 100177HP_QUAD_2E_2VA, // E = 1001, V = 111078HP_QUAD_2E_2VB, // E = 1001, V = 110179HP_QUAD_2E_2VC, // E = 1001, V = 101180HP_QUAD_2E_3V, // E = 1001, V = 11118182HP_QUAD_2EB_0V, // E = 1010, V = 000083HP_QUAD_2EB_1VA, // E = 1010, V = 100084HP_QUAD_2EB_1VB, // E = 1010, V = 010085HP_QUAD_2EB_2VA, // E = 1010, V = 110086HP_QUAD_2EB_2VB, // E = 1010, V = 101087HP_QUAD_2EB_2VC, // E = 1010, V = 100188HP_QUAD_2EB_2VD, // E = 1010, V = 010189HP_QUAD_2EB_3VA, // E = 1010, V = 111090HP_QUAD_2EB_3VB, // E = 1010, V = 11019192HP_QUAD_2EB_4V,939495HP_QUAD_3E, // E = 1101, V = 110096HP_QUAD_3E_3VA, // E = 1101, V = 111097HP_QUAD_3E_3VB, // E = 1101, V = 110198HP_QUAD_3E_4V, // E = 1101, V = 111199100HP_QUAD_4E,101102103HP_TET = 100, // no singular vertex/edge104HP_TET_0E_1V, // V1105HP_TET_0E_2V, // V1,2106HP_TET_0E_3V, // V1,2,3107HP_TET_0E_4V, // V1,2,3,4108HP_TET_1E_0V = 200, // E1-2109HP_TET_1E_1VA, // V1110HP_TET_1E_1VB, // V3111HP_TET_1E_2VA, // V1,2112HP_TET_1E_2VB, // V1,3113HP_TET_1E_2VC, // V1,4114HP_TET_1E_2VD, // V3,4115HP_TET_1E_3VA, // V1,2,3116HP_TET_1E_3VB, // V1,3,4117HP_TET_1E_4V, // V1,2,3,4118119120// 2 connected edges, additonally marked Vs121HP_TET_2EA_0V = 220, // E1-2, E1-3122HP_TET_2EA_1VA, // V2123HP_TET_2EA_1VB, // V3124HP_TET_2EA_1VC, // V4125HP_TET_2EA_2VA, // V2,3126HP_TET_2EA_2VB, // V2,4127HP_TET_2EA_2VC, // V3,4128HP_TET_2EA_3V, // V2,3,4129130// 2 opposite edges131HP_TET_2EB_0V = 230, // E1-2, E3-4132HP_TET_2EB_1V, // V1133HP_TET_2EB_2VA, // V1,2134HP_TET_2EB_2VB, // V1,3135HP_TET_2EB_2VC, // V1,4136HP_TET_2EB_3V, // V1,2,3137HP_TET_2EB_4V, // V1,2,3,4138139HP_TET_3EA_0V = 400, // E1-2, E1-3, E1-4, 3 edges connected140HP_TET_3EA_1V, // V2141HP_TET_3EA_2V, // V2,3142HP_TET_3EA_3V, // V2,3,4143144HP_TET_3EB_0V = 420, // E1-2, E1-4, E2-3 3 edges chain145HP_TET_3EB_1V, //146HP_TET_3EB_2V, //147HP_TET_3EC_0V = 430, // 3 edges chain, alter148HP_TET_3EC_1V, // 3 edges chain, alter149HP_TET_3EC_2V, // 3 edges chain, alter150151152HP_TET_1F_0E_0V = 500, // 1 singular face153HP_TET_1F_0E_1VA, // 1 sing vertex in face (V2)154HP_TET_1F_0E_1VB, // 1 sing vertex not in face (V1)155HP_TET_1F_1EA_0V, // 1 sing edge not in face156HP_TET_1F_1EB_0V, // 1 sing edge in face157HP_TET_2F_0E_0V = 600, // 2 singular faces158159HP_PRISM = 1000,160HP_PRISM_SINGEDGE,161HP_PRISM_SINGEDGE_V12,162HP_PRISM_SINGEDGE_H1,163HP_PRISM_SINGEDGE_H12,164165HP_PRISM_1FA_0E_0V, // 1 singular trig face166HP_PRISM_2FA_0E_0V, // 2 singular trig faces167HP_PRISM_1FB_0E_0V, // 1 singular quad face 1-2-4-5168169HP_PRISM_1FB_1EA_0V, // 1 singular quad face, edge is 1-2170HP_PRISM_1FA_1E_0V,171HP_PRISM_2FA_1E_0V,172HP_PRISM_1FA_1FB_0E_0V,173HP_PRISM_2FA_1FB_0E_0V,174HP_PRISM_1FA_1FB_1EA_0V,175HP_PRISM_1FA_1FB_1EB_0V,176HP_PRISM_2FA_1FB_1EA_0V,177HP_PRISM_1FB_1EC_0V,178HP_PRISM_1FA_1FB_1EC_0V,179HP_PRISM_2FA_1FB_1EC_0V,180HP_PRISM_1FB_2EA_0V,181HP_PRISM_1FA_1FB_2EA_0V,182HP_PRISM_2FA_1FB_2EA_0V,183HP_PRISM_1FB_2EB_0V,184HP_PRISM_1FA_1FB_2EB_0V,185HP_PRISM_1FA_1FB_2EC_0V,186HP_PRISM_2FA_1FB_2EB_0V,187HP_PRISM_1FB_3E_0V,188HP_PRISM_1FA_1FB_3E_0V,189HP_PRISM_2FA_1FB_3E_0V,190HP_PRISM_2FB_0E_0V,191HP_PRISM_1FA_2FB_0E_0V,192HP_PRISM_2FA_2FB_0E_0V,193HP_PRISM_2FB_1EC_0V,194HP_PRISM_1FA_2FB_1EC_0V,195HP_PRISM_1FA_2FB_1EB_0V,196HP_PRISM_2FA_2FB_1EC_0V,197HP_PRISM_2FB_3E_0V,198HP_PRISM_1FA_2FB_3E_0V,199HP_PRISM_2FA_2FB_3E_0V,200HP_PRISM_1FA_2E_0V,201HP_PRISM_2FA_2E_0V,202HP_PRISM_3E_0V,203HP_PRISM_1FA_3E_0V,204HP_PRISM_2FA_3E_0V,205HP_PRISM_3FB_0V,206HP_PRISM_1FA_3FB_0V,207HP_PRISM_2FA_3FB_0V,208HP_PRISM_3E_4EH,209210211212/* HP_PRISM_1FB_1EA_0V, // 1 singular quad face, edge is 1-4213HP_PRISM_1FB_1EB_0V, // 1 singular quad face, edge is 2-5214HP_PRISM_2F_0E_0V, // 2 singular quad faces215*/216217HP_PYRAMID = 2000,218HP_PYRAMID_0E_1V,219HP_PYRAMID_EDGES,220HP_PYRAMID_1FB_0E_1VA, // 1 trig face, top vertex221222HP_HEX = 3000,223HP_HEX_0E_1V,224HP_HEX_1E_1V,225HP_HEX_1E_0V,226HP_HEX_3E_0V,227HP_HEX_1F_0E_0V,228HP_HEX_1FA_1FB_0E_0V,229};230231232233struct HPRef_Struct {234HPREF_ELEMENT_TYPE geom;235int (*splitedges)[3];236int (*splitfaces)[4];237int (*splitelements)[5];238HPREF_ELEMENT_TYPE * neweltypes;239int (*newels)[8];240};241242243244245class HPRefElement246{247private:248void Reset(void);249250public:251HPRefElement ();252HPRefElement(Element & el);253HPRefElement(Element2d & el);254HPRefElement(Segment & el);255HPRefElement(HPRefElement & el);256257void SetType( HPREF_ELEMENT_TYPE t);258// HPRefElement(HPRefElement & el, HPREF_ELEMENT_TYPE t);259260/* HPRefElement(HPRefElement & el, HPREF_ELEMENT_TYPE t)261{262type = t;263HPRef_Struct * hprs = Get_HPRef_Struct(t);264for (int i=0; i<np ; i++)265{266pnums[i] = el[i];267for(int l=0; l<np; l++) param[i][l] = el.param[i][l];268}269switch(hprs->geom)270{271case HP_SEGM: np=2; sing_edge_left=0; sing_edge_right=0; break;272case HP_QUAD: np=4; break;273case HP_TRIG: np=3; break;274case HP_HEX: np=8; break;275case HP_PRISM: np=6; break;276case HP_TET: np=4; break;277case HP_PYRAMID: np=5; break;278}279index = el.index;280levelx = el.levelx;281levely = el.levely;282levelz = el.levelz;283type = el.type;284coarse_elnr = el.coarse_elnr;285singedge_left = el.singedge_left;286singedge_right = el.singedge_left;287} */288289HPREF_ELEMENT_TYPE type;290PointIndex pnums[8];291double param[8][3];292int index;293int levelx;294int levely;295int levelz;296int np;297int coarse_elnr;298int domin, domout; // he: needed for segment!! in 3d there should be surf1, surf2!!299// int coarse_hpelnr;300PointIndex & operator[](int i) { return(pnums[i]);}301PointIndex & PNumMod(int i) { return pnums[(i-1) % np]; };302PointIndex & PNum(int i) {return pnums[(i-1)]; };303int GetIndex () const { return index; };304double singedge_left, singedge_right;305306307// EdgePointGeomInfo epgeominfo[2];308309};310311312313extern void HPRefinement (Mesh & mesh, Refinement * ref, int levels,314double fac1=0.125, bool setorders=true, bool ref_level = false);315316317#endif318319320321