Netgen mesh library : nglib

eryar@163.com

摘要Abstract:本文主是对Netgen的库nglib的用法进行介绍。主要参考资料是Netgen用户指南。最后给出一个具体程序实例。

关键字Key Words:Netgen, nglib, Mesh

一、引言 Introduction

Netgen网格生成库nglib是以C++源程序形式提供,可以编译为Unix/Linux或Windows上的库文件。程序开发使用的接口文件是nglib.h。

二、头文件 The Header File

接口文件中包含了一些类型定义和函数调用,所有的Netgen类型和函数都带有前缀Ng。类型和函数首字母大写,所有常量都是大写。

三、类型和常量 Types and Constants

// ** Constants used within Netgen *********************
/// Maximum allowed number of nodes per volume element
#define NG_VOLUME_ELEMENT_MAXPOINTS 10 /// Maximum allowed number of nodes per surface element
#define NG_SURFACE_ELEMENT_MAXPOINTS 8 // *** Data-types for accessing Netgen functionality ***
/// Data type for NETGEN mesh
typedef void * Ng_Mesh; /// Data type for NETGEN CSG geometry
typedef void * Ng_CSG_Geometry; /// Data type for NETGEN 2D geometry
typedef void * Ng_Geometry_2D; /// Data type for NETGEN STL geometry
typedef void * Ng_STL_Geometry; // *** Special Enum types used within Netgen ***********
/// Currently implemented surface element types
enum Ng_Surface_Element_Type
{ NG_TRIG = , NG_QUAD = , NG_TRIG6 = , NG_QUAD6 = , NG_QUAD8 = }; /// Currently implemented volume element types
enum Ng_Volume_Element_Type
{ NG_TET = , NG_PYRAMID = , NG_PRISM = , NG_TET10 = }; /// Values returned by Netgen functions
enum Ng_Result
{
NG_ERROR = -,
NG_OK = ,
NG_SURFACE_INPUT_ERROR = ,
NG_VOLUME_FAILURE = ,
NG_STL_INPUT_ERROR = ,
NG_SURFACE_FAILURE = ,
NG_FILE_NOT_FOUND =
}; // *** Classes required for use within Netgen **********
/// Netgen Meshing Parameters class
class Ng_Meshing_Parameters
{
public:
int uselocalh; //!< Switch to enable / disable usage of local mesh size modifiers
double maxh; //!< Maximum global mesh size allowed
double minh; //!< Minimum global mesh size allowed double fineness; //!< Mesh density: 0...1 (0 => coarse; 1 => fine)
double grading; //!< Mesh grading: 0...1 (0 => uniform mesh; 1 => aggressive local grading)
double elementsperedge; //!< Number of elements to generate per edge of the geometry
double elementspercurve; //!< Elements to generate per curvature radius

Ng_Mesh表示Netgen网格的数据结构。Ng_STL_Geometry表示STL几何。可以通过Ng_Meshing_Parameters来指定生成网格时的参数。Netgen函数的返回值类型是Ng_Result。

四、初始化 Initialization

分别调用如下两个函数对netgen初始化和析构:

/*! \brief Initialise the Netgen library and prepare for use
*/
DLL_HEADER void Ng_Init ();
/*! \brief Exit the Netgen meshing kernel in a clean manner
*/
DLL_HEADER void Ng_Exit ();

五、网格的访问 Mesh access

Netgen网格可以通过如下函数来处理。一个网格包含nodes, surface elements和volume elements。都是从1开始计数的。

// Generates new mesh structure
Ng_Mesh * Ng_NewMesh ();
void Ng_DeleteMesh (Ng_Mesh * mesh);
// feeds points, surface elements and volume elements to the mesh
void Ng_AddPoint (Ng_Mesh * mesh, double * x);
void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi);
void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi);
// ask for number of points, surface and volume elements
int Ng_GetNP (Ng_Mesh * mesh);
int Ng_GetNSE (Ng_Mesh * mesh);
int Ng_GetNE (Ng_Mesh * mesh);
// return point coordinates
void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x);
// return surface and volume element in pi
Ng_Surface_Element_Type
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi);
Ng_Volume_Element_Type
Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi);

更多信息请参考其头文件nglib.h。

在生成网格时,用户可以指定网格大小及一些约束。函数Ng_GenerateVolumeMesh从曲面生成网格。

/*! \brief Apply a global restriction on mesh element size
*/
DLL_HEADER void Ng_RestrictMeshSizeGlobal (Ng_Mesh * mesh, double h); /*! \brief Locally restrict the mesh element size at the given point
*/
DLL_HEADER void Ng_RestrictMeshSizePoint (Ng_Mesh * mesh, double * p, double h); /*! \brief Locally restrict the mesh element size within a specified box
*/
DLL_HEADER void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * pmax, double h);
/*! \brief Create a 3D Volume Mesh given a Surface Mesh
*/
DLL_HEADER Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp);

六、STL几何 STL Geometry

STL几何数据可以从STL文件(ASCII或二进制)读取,也可以由一个个的三角形组装而成。

// loads geometry from STL file
DLL_HEADER Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int binary = ); // generate new STL Geometry
DLL_HEADER Ng_STL_Geometry * Ng_STL_NewGeometry (); // fills STL Geometry
// positive orientation
// normal vector may be null-pointer
DLL_HEADER void Ng_STL_AddTriangle (Ng_STL_Geometry * geom,
double * p1, double * p2, double * p3,
double * nv = NULL); // add (optional) edges :
DLL_HEADER void Ng_STL_AddEdge (Ng_STL_Geometry * geom,
double * p1, double * p2); // after adding triangles (and edges) initialize
DLL_HEADER Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom); // automatically generates edges:
DLL_HEADER Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
Ng_Mesh* mesh,
Ng_Meshing_Parameters * mp); // generates mesh, empty mesh must be already created.
DLL_HEADER Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
Ng_Mesh * mesh,
Ng_Meshing_Parameters * mp);

七、示例程序 Example Code

在Netgen的安装目录下的nglib文件夹中有两个示例程序ng_vol.cpp和ng_stl.cpp。其中ng_vol.cpp程序开始时从cube.surf文件读入点坐标和曲面的三角形,生成的volumne mesh输出到文件:cuve.vol。经过测试,程序可以运行,修改过的代码如下所示:

#include <iostream>
#include <fstream> namespace nglib {
#include <nglib.h>
} #pragma comment(lib, "nglib.lib") int main(int argc, char* argv[])
{
std::cout << "Netgen Testing..." << std::endl; int i = ;
int np = ;
int nse = ;
int ne = ;
int trig[] = {};
int tet[] = {}; double point[] = {0.0}; std::string strMeshFile = (argc > )? argv[]: "cube.surf";
std::ifstream meshFile(strMeshFile.c_str()); // initialize the Netgen library.
nglib::Ng_Init(); // Generate new mesh structure.
nglib::Ng_Mesh* mesh = nglib::Ng_NewMesh(); // Read surface mesh from file.
// feed points to the mesh.
meshFile >> np;
std::cout << "Reading " << np << " points..." << std::endl;
for (int i = ; i < np; ++i)
{
meshFile >> point[] >> point[] >> point[];
nglib::Ng_AddPoint(mesh, point);
}
std::cout << "done." << std::endl; // feed surface elements to the mesh.
meshFile >> nse;
std::cout << "Reading " << nse << " faces..." << std::endl;
for (int i = ; i < nse; ++i)
{
meshFile >> trig[] >> trig[] >> trig[];
nglib::Ng_AddSurfaceElement(mesh, nglib::NG_TRIG, trig);
}
std::cout << "done." << std::endl; // generate volume mesh.
nglib::Ng_Meshing_Parameters mp;
mp.maxh = 1e6;
mp.fineness = ;
mp.second_order = ; std::cout << "start meshing..." << std::endl;
nglib::Ng_GenerateVolumeMesh(mesh, &mp);
std::cout << "meshing done." << std::endl; // volume mesh output.
np = nglib::Ng_GetNP(mesh);
std::cout << "Points: " << np << std::endl;
for (int i = ; i <= np; ++i)
{
nglib::Ng_GetPoint(mesh, i, point);
std::cout << i << ": " << point[] << ", " << point[] << ", " << point[] << std::endl;
} ne = nglib::Ng_GetNE(mesh);
std::cout << "Elements: " << ne << std::endl;
for (int i = ; i <= ne; ++i)
{
nglib::Ng_GetVolumeElement(mesh, i, tet);
std::cout << i << ": " << tet[] << ", " << tet[] << ", " << tet[] << ", " << tet[] << std::endl;
} // Save mesh.
nglib::Ng_SaveMesh(mesh, "test.vol"); // deconstruct Netgen library.
nglib::Ng_Exit(); return ;
}

Netgen mesh library : nglib的更多相关文章

  1. Hello Netgen

    Hello Netgen eryar@163.com 摘要Abstract:本文主要介绍如何对下载的Netgen源码进行编译生成Netgen程序和程序开发所需要的库nglib. 关键字Key Word ...

  2. nRF5 SDK for Mesh(四) 源码编译

    官方文档教程编译源码: http://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.sdk%2Fdita%2Fs ...

  3. CG&CAD resource

    Computational Geometry The Geometry Center (UIUC) Computational Geometry Pages (UIUC) Geometry in Ac ...

  4. software collection

    software software Table of Contents 1. Privacy 2. GFW 2.1. google search 2.2. 修改 DNS 服务器 2.2.1. 修改ip ...

  5. Computer Graphics Research Software

    Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...

  6. EasyMesh - A Two-Dimensional Quality Mesh Generator

    EasyMesh - A Two-Dimensional Quality Mesh Generator eryar@163.com Abstract. EasyMesh is developed by ...

  7. Mesh Data Structure in OpenCascade

    Mesh Data Structure in OpenCascade eryar@163.com 摘要Abstract:本文对网格数据结构作简要介绍,并结合使用OpenCascade中的数据结构,将网 ...

  8. Mesh Algorithm in OpenCascade

    Mesh Algorithm in OpenCascade eryar@163.com Abstract. Rendering a generic surface is a two steps pro ...

  9. What’s a service mesh? And why do I need one?

    https://buoyant.io/2017/04/25/whats-a-service-mesh-and-why-do-i-need-one/ Update 2018-02-06: Since t ...

随机推荐

  1. javascript中常用操作字符串的几种方法charAt()、indexOf()、slice()、substr()

    一.charAt(index) 返回一个字符串某一个索引的字符. 语法:str.charAt(index); var str='我是中国人'; console.log(str.charAt(3));/ ...

  2. explode,split,preg_split性能比较

      explode,split,preg_split性能比较 分类: php2012-07-12 09:46 1109人阅读 评论(1) 收藏 举报 三个函数都是用来对字符串进行分割,下面分几个实验来 ...

  3. SSH框架的简单示例(执行流程)

    本文转自一篇博文,感觉通俗易懂,适用于初学j2ee者,与大家一起分享 (一)struts框架部分 1.打开Myeclipse,创建一个web project,项目名称为TestSSH. 2.在web的 ...

  4. Android 环境搭建

    一.Android 环境搭建 开发工具: Android Studio(开发工具,前提是先装 java JDK) 下载地址:http://www.androiddevtools.cn/   Oracl ...

  5. linux配置本地源

    yum本地源配置 标签: centosplugins网络file虚拟机linux 2011-10-09 21:40 12093人阅读 评论(1) 收藏 举报  分类: linux yum 在网上找了很 ...

  6. Bootstrap CDN推荐

    Bootstrap CDN推荐 本站实例采用的是百度的静态资源库(http://cdn.code.baidu.com/)上的Bootstrap资源. 百度的静态资源库的 CDN 服务,访问速度更快.加 ...

  7. android 启动过程

    android系统启动的时候首先会启动Linux的基础进程,加载Linux kernel启动初始化(init)进程. 接着,回启动Linux deamon(守护进程)会启动以下的内容: ①启动USBd ...

  8. 让ZenCoding提升编码速度

    日前写了一篇关于VS神级插件Web Essentials的系列博客,其中在HTML&CSS操作技巧一节简单提到了ZenCoding,今天来详细说一下这个东西. 摘要 Zen Coding是一种 ...

  9. 【Bugly技术干货】那些年我们用过的显示性能指标

    Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 前言: 注:Google 在自己文 ...

  10. 设计模式之美:Template Method(模板方法)

    索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Template Method 模式结构样式代码. 意图 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中. Templat ...