mFES - molecular Finite Element Solver
0.4
|
00001 #ifndef NGLIB 00002 #define NGLIB 00003 00004 /**************************************************************************/ 00005 /* File: nglib.h */ 00006 /* Author: Joachim Schoeberl */ 00007 /* Date: 7. May. 2000 */ 00008 /**************************************************************************/ 00009 00024 // Philippose - 14.02.2009 00025 // Modifications for creating a DLL in Windows 00026 #ifdef WIN32 00027 #ifdef NGLIB_EXPORTS || nglib_EXPORTS 00028 #define DLL_HEADER __declspec(dllexport) 00029 #else 00030 #define DLL_HEADER __declspec(dllimport) 00031 #endif 00032 #else 00033 #define DLL_HEADER 00034 #endif 00035 00036 00037 00038 // ** Constants used within Netgen ********************* 00040 #define NG_VOLUME_ELEMENT_MAXPOINTS 10 00041 00043 #define NG_SURFACE_ELEMENT_MAXPOINTS 8 00044 00045 00046 00047 // *** Data-types for accessing Netgen functionality *** 00049 typedef void * Ng_Mesh; 00050 00052 typedef void * Ng_CSG_Geometry; 00053 00055 typedef void * Ng_Geometry_2D; 00056 00058 typedef void * Ng_STL_Geometry; 00059 00060 #ifdef OCCGEOMETRY 00061 00062 typedef void * Ng_OCC_Geometry; 00063 typedef void * Ng_OCC_TopTools_IndexedMapOfShape; 00064 #endif 00065 00066 00067 // *** Special Enum types used within Netgen *********** 00069 enum Ng_Surface_Element_Type 00070 { NG_TRIG = 1, NG_QUAD = 2, NG_TRIG6 = 3, NG_QUAD6 = 4, NG_QUAD8 = 5 }; 00071 00073 enum Ng_Volume_Element_Type 00074 { NG_TET = 1, NG_PYRAMID = 2, NG_PRISM = 3, NG_TET10 = 4 }; 00075 00077 enum Ng_Result 00078 { 00079 NG_ERROR = -1, 00080 NG_OK = 0, 00081 NG_SURFACE_INPUT_ERROR = 1, 00082 NG_VOLUME_FAILURE = 2, 00083 NG_STL_INPUT_ERROR = 3, 00084 NG_SURFACE_FAILURE = 4, 00085 NG_FILE_NOT_FOUND = 5 00086 }; 00087 00088 00089 00090 // *** Classes required for use within Netgen ********** 00092 class Ng_Meshing_Parameters 00093 { 00094 public: 00095 00096 int blockfill; 00097 float filldist; 00098 00099 int uselocalh; 00100 00101 double maxh; 00102 double minh; 00103 00104 double fineness; 00105 double grading; 00106 00107 double elementsperedge; 00108 double elementspercurve; 00109 00110 int closeedgeenable; 00111 double closeedgefact; 00112 00113 int second_order; 00114 int quad_dominated; 00115 00116 char * meshsize_filename; 00117 00118 int optsurfmeshenable; 00119 int optvolmeshenable; 00120 00121 int optsteps_3d; 00122 int optsteps_2d; 00123 00124 // Philippose - 13/09/2010 00125 // Added a couple more parameters into the meshing parameters list 00126 // from Netgen into Nglib 00127 int invert_tets; 00128 int invert_trigs; 00129 00130 int check_overlap; 00131 int check_overlapping_boundary; 00132 00133 00159 DLL_HEADER Ng_Meshing_Parameters(); 00160 00161 00162 00169 DLL_HEADER void Reset_Parameters(); 00170 00171 00172 00180 DLL_HEADER void Transfer_Parameters(); 00181 }; 00182 00183 00184 00185 00186 // *** Functions Exported by this Library ************* 00187 00188 // ------------------------------------------------------------------ 00189 // Netgen library initialisation / destruction functions 00190 00197 DLL_HEADER void Ng_Init (); 00198 00199 00205 DLL_HEADER void Ng_Exit (); 00206 00207 00218 DLL_HEADER Ng_Mesh * Ng_NewMesh (); 00219 00220 00229 DLL_HEADER void Ng_DeleteMesh (Ng_Mesh * mesh); 00230 00231 00246 DLL_HEADER void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename); 00247 00248 00259 DLL_HEADER Ng_Mesh * Ng_LoadMesh(const char* filename); 00260 00273 DLL_HEADER Ng_Mesh * Ng_SetProperties(Ng_Mesh * m, int surfnr, int bcnr, int domin, int domout); 00274 00275 00286 DLL_HEADER Ng_Result Ng_MergeMesh(Ng_Mesh * mesh, const char* filename); 00287 00288 00303 DLL_HEADER Ng_Result Ng_MergeMesh(Ng_Mesh * mesh1, Ng_Mesh * mesh2); 00304 // ------------------------------------------------------------------ 00305 00306 00307 00308 // ------------------------------------------------------------------ 00309 // Basic Meshing functions for manually adding points, surface elements 00310 // and volume elements to a Netgen Mesh structure 00311 00327 DLL_HEADER void Ng_AddPoint (Ng_Mesh * mesh, double * x); 00328 00329 00350 DLL_HEADER void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi); 00351 00352 00374 DLL_HEADER void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi); 00375 00376 // ------------------------------------------------------------------ 00377 00378 00379 00380 // ------------------------------------------------------------------ 00381 // Local Mesh Size restriction / limiting utilities 00382 00401 DLL_HEADER void Ng_RestrictMeshSizeGlobal (Ng_Mesh * mesh, double h); 00402 00403 00425 DLL_HEADER void Ng_RestrictMeshSizePoint (Ng_Mesh * mesh, double * p, double h); 00426 00427 00456 DLL_HEADER void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * pmax, double h); 00457 00458 // ------------------------------------------------------------------ 00459 00460 00461 00462 // ------------------------------------------------------------------ 00463 // 3D Mesh Generation functions 00464 00487 DLL_HEADER Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp); 00488 00489 // ------------------------------------------------------------------ 00490 00491 00492 00493 // ------------------------------------------------------------------ 00494 // Basic Mesh information functions 00495 00506 DLL_HEADER int Ng_GetNP (Ng_Mesh * mesh); 00507 00508 00520 DLL_HEADER int Ng_GetNSE (Ng_Mesh * mesh); 00521 00522 00534 DLL_HEADER int Ng_GetNE (Ng_Mesh * mesh); 00535 00536 // ------------------------------------------------------------------ 00537 00538 00539 00540 // ------------------------------------------------------------------ 00541 // Mesh Topology functions 00542 // Use these functions to extract points, surface / volume elements, 00543 // perform topological searches, etc..etc... 00544 00545 // Return the Point Coordinates of a specified Point 00546 // The x, y and z co-ordinates are returned in the array pointer as 00547 // x[0] = x ; x[1] = y ; x[2] = z 00548 DLL_HEADER void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x); 00549 00550 00551 00552 // return surface and volume element in pi 00553 DLL_HEADER Ng_Surface_Element_Type 00554 Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi); 00555 00556 DLL_HEADER Ng_Volume_Element_Type 00557 Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi); 00558 00559 // ------------------------------------------------------------------ 00560 00561 00562 00563 00564 // ********************************************************** 00565 // ** 2D Meshing ** 00566 // ********************************************************** 00567 00568 00569 // feeds points and boundary to mesh 00570 00571 DLL_HEADER void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x); 00572 DLL_HEADER void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2); 00573 00574 // ask for number of points, elements and boundary segments 00575 DLL_HEADER int Ng_GetNP_2D (Ng_Mesh * mesh); 00576 DLL_HEADER int Ng_GetNE_2D (Ng_Mesh * mesh); 00577 DLL_HEADER int Ng_GetNSeg_2D (Ng_Mesh * mesh); 00578 00579 // return point coordinates 00580 DLL_HEADER void Ng_GetPoint_2D (Ng_Mesh * mesh, int num, double * x); 00581 00582 // return 2d elements 00583 DLL_HEADER Ng_Surface_Element_Type 00584 Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL); 00585 00586 // return 2d boundary segment 00587 DLL_HEADER void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL); 00588 00589 00590 // load 2d netgen spline geometry 00591 DLL_HEADER Ng_Geometry_2D * Ng_LoadGeometry_2D (const char * filename); 00592 00593 // generate 2d mesh, mesh is allocated by function 00594 DLL_HEADER Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom, 00595 Ng_Mesh ** mesh, 00596 Ng_Meshing_Parameters * mp); 00597 00598 DLL_HEADER void Ng_HP_Refinement (Ng_Geometry_2D * geom, 00599 Ng_Mesh * mesh, 00600 int levels); 00601 00602 00603 00604 00605 00606 // ********************************************************** 00607 // ** STL Meshing ** 00608 // ********************************************************** 00609 00610 00611 // loads geometry from STL file 00612 DLL_HEADER Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int binary = 0); 00613 00614 00615 // generate new STL Geometry 00616 DLL_HEADER Ng_STL_Geometry * Ng_STL_NewGeometry (); 00617 00618 00619 // fills STL Geometry 00620 // positive orientation 00621 // normal vector may be null-pointer 00622 DLL_HEADER void Ng_STL_AddTriangle (Ng_STL_Geometry * geom, 00623 double * p1, double * p2, double * p3, 00624 double * nv = NULL); 00625 00626 // add (optional) edges : 00627 DLL_HEADER void Ng_STL_AddEdge (Ng_STL_Geometry * geom, 00628 double * p1, double * p2); 00629 00630 // after adding triangles (and edges) initialize 00631 DLL_HEADER Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom); 00632 00633 // automatically generates edges: 00634 DLL_HEADER Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom, 00635 Ng_Mesh* mesh, 00636 Ng_Meshing_Parameters * mp); 00637 00638 00639 // generates mesh, empty mesh must be already created. 00640 DLL_HEADER Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom, 00641 Ng_Mesh * mesh, 00642 Ng_Meshing_Parameters * mp); 00643 00644 00645 #ifdef ACIS 00646 00647 // ********************************************************** 00648 // ** ACIS Meshing ** 00649 // ********************************************************** 00650 00652 typedef void * Ng_ACIS_Geometry; 00653 00654 // loads geometry from STL file 00655 DLL_HEADER Ng_ACIS_Geometry * Ng_ACIS_LoadGeometry (const char * filename); 00656 00657 // generates mesh, empty mesh must be already created. 00658 DLL_HEADER Ng_Result Ng_ACIS_GenerateSurfaceMesh (Ng_ACIS_Geometry * geom, 00659 Ng_Mesh * mesh, 00660 Ng_Meshing_Parameters * mp); 00661 00662 00663 #endif 00664 00665 00666 00667 #ifdef OCCGEOMETRY 00668 00669 // ********************************************************** 00670 // ** OpenCascade Geometry / Meshing Utilities ** 00671 // ********************************************************** 00672 00673 // Create new OCC Geometry Object 00674 DLL_HEADER Ng_OCC_Geometry * Ng_OCC_NewGeometry (); 00675 00676 // Delete an OCC Geometry Object 00677 DLL_HEADER Ng_Result Ng_OCC_DeleteGeometry (Ng_OCC_Geometry * geom); 00678 00679 // Loads geometry from STEP file 00680 DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_STEP (const char * filename); 00681 00682 // Loads geometry from IGES file 00683 DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_IGES (const char * filename); 00684 00685 // Loads geometry from BREP file 00686 DLL_HEADER Ng_OCC_Geometry * Ng_OCC_Load_BREP (const char * filename); 00687 00688 // Set the local mesh size based on geometry / topology 00689 DLL_HEADER Ng_Result Ng_OCC_SetLocalMeshSize (Ng_OCC_Geometry * geom, 00690 Ng_Mesh * mesh, 00691 Ng_Meshing_Parameters * mp); 00692 00693 // Mesh the edges and add Face descriptors to prepare for surface meshing 00694 DLL_HEADER Ng_Result Ng_OCC_GenerateEdgeMesh (Ng_OCC_Geometry * geom, 00695 Ng_Mesh * mesh, 00696 Ng_Meshing_Parameters * mp); 00697 00698 // Mesh the surfaces of an OCC geometry 00699 DLL_HEADER Ng_Result Ng_OCC_GenerateSurfaceMesh (Ng_OCC_Geometry * geom, 00700 Ng_Mesh * mesh, 00701 Ng_Meshing_Parameters * mp); 00702 00703 // Get the face map of an already loaded OCC geometry 00704 DLL_HEADER Ng_Result Ng_OCC_GetFMap(Ng_OCC_Geometry * geom, 00705 Ng_OCC_TopTools_IndexedMapOfShape * FMap); 00706 00707 #endif // OCCGEOMETRY 00708 00709 00710 00711 // ********************************************************** 00712 // ** Mesh refinement algorithms ** 00713 // ********************************************************** 00714 00715 // uniform mesh refinement 00716 DLL_HEADER void Ng_Uniform_Refinement (Ng_Mesh * mesh); 00717 00718 00719 // uniform mesh refinement with geometry adaption: 00720 00721 DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom, 00722 Ng_Mesh * mesh); 00723 00724 DLL_HEADER void Ng_STL_Uniform_Refinement (Ng_STL_Geometry * geom, 00725 Ng_Mesh * mesh); 00726 00727 DLL_HEADER void Ng_CSG_Uniform_Refinement (Ng_CSG_Geometry * geom, 00728 Ng_Mesh * mesh); 00729 00730 #ifdef OCCGEOMETRY 00731 DLL_HEADER void Ng_OCC_Uniform_Refinement (Ng_OCC_Geometry * geom, 00732 Ng_Mesh * mesh); 00733 #endif 00734 00735 00736 00737 // ********************************************************** 00738 // ** Second Order mesh algorithms ** 00739 // ********************************************************** 00740 00741 // convert mesh to second order 00742 DLL_HEADER void Ng_Generate_SecondOrder (Ng_Mesh * mesh); 00743 00744 00745 // convert mesh to second order with geometry adaption: 00746 00747 DLL_HEADER void Ng_2D_Generate_SecondOrder (Ng_Geometry_2D * geom, 00748 Ng_Mesh * mesh); 00749 00750 DLL_HEADER void Ng_STL_Generate_SecondOrder (Ng_STL_Geometry * geom, 00751 Ng_Mesh * mesh); 00752 00753 DLL_HEADER void Ng_CSG_Generate_SecondOrder (Ng_CSG_Geometry * geom, 00754 Ng_Mesh * mesh); 00755 00756 #ifdef OCCGEOMETRY 00757 DLL_HEADER void Ng_OCC_Generate_SecondOrder (Ng_OCC_Geometry * geom, 00758 Ng_Mesh * mesh); 00759 #endif 00760 00761 00762 #endif // NGLIB