mFES - molecular Finite Element Solver  0.4
nglib.h
Go to the documentation of this file.
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