Merge 9d8da1560435d87c65ed775663e235ca901cfb99 into 971f7c6b073e67b183fa405f2f97f2f35cc8b301

This commit is contained in:
Bryn Lloyd 2023-05-31 17:47:03 -07:00 committed by GitHub
commit 650fa0eb28
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 2250 additions and 111 deletions

View File

@ -23,7 +23,7 @@ namespace ngcore
}
static bool dummy = [](){
SetLibraryVersion("netgen", NETGEN_VERSION);
SetLibraryVersion("netgen", VersionInfo(NETGEN_VERSION));
return true;
}();
} // namespace ngcore

View File

@ -18,37 +18,41 @@ namespace ngcore
VersionInfo() = default;
VersionInfo(std::string vstring)
{
try {
minor_ = release = patch = 0;
git_hash = "";
if(vstring.substr(0,1) == "v")
vstring = vstring.substr(1,vstring.size()-1);
auto dot = vstring.find('.');
mayor_ = std::stoi(vstring.substr(0,dot));
if(dot == size_t(-1)) vstring = "";
if(dot == std::string::npos) vstring = "";
else vstring = vstring.substr(dot+1, vstring.size()-dot-1);
if(!vstring.empty())
{
dot = vstring.find('.');
minor_ = std::stoi(vstring.substr(0,dot));
if (dot == size_t(-1)) vstring = "";
if (dot == std::string::npos) vstring = "";
else vstring = vstring.substr(dot+1, vstring.size()-dot-1);
if(!vstring.empty())
{
dot = vstring.find('-');
release = std::stoi(vstring.substr(0,dot));
if(dot == size_t(-1)) vstring = "";
if(dot == std::string::npos) vstring = "";
else vstring = vstring.substr(dot+1,vstring.size()-dot-1);
if(!vstring.empty())
{
dot = vstring.find('-');
patch = std::stoi(vstring.substr(0,dot));
if(dot == size_t(-1)) vstring = "";
if(dot == std::string::npos) vstring = "";
else vstring = vstring.substr(dot+1, vstring.size()-dot-1);
if(!vstring.empty())
git_hash = vstring;
}
}
}
}
catch (const std::invalid_argument&)
{}
}
VersionInfo(const char* cstr) : VersionInfo(std::string(cstr)) { }

View File

@ -2,7 +2,7 @@ target_sources(nglib PRIVATE
nginterface.cpp nginterface_v2.cpp
read_fnf_mesh.cpp readtetmesh.cpp readuser.cpp writeabaqus.cpp writediffpack.cpp
writedolfin.cpp writeelmer.cpp writefeap.cpp writefluent.cpp writegmsh.cpp writejcm.cpp
writepermas.cpp writetecplot.cpp writetet.cpp writetochnog.cpp writeuser.cpp
writepermas.cpp writetecplot.cpp writetet.cpp writetochnog.cpp writeuser.cpp writevtk.cpp
wuchemnitz.cpp writegmsh2.cpp writeOpenFOAM15x.cpp rw_cgns.cpp
)

View File

@ -40,8 +40,9 @@ namespace netgen
"VRML Format", ".*",
"Gmsh Format", ".gmsh",
"Gmsh2 Format", ".gmsh2",
"VTK Format", ".vtk",
"OpenFOAM 1.5+ Format", "*",
"OpenFOAM 1.5+ Compressed", "*",
"OpenFOAM 1.5+ Compressed", "*",
"JCMwave Format", ".jcm",
"TET Format", ".tet",
"CGNS Format", ".cgns",
@ -130,6 +131,9 @@ bool WriteUserFormat (const filesystem::path & format,
else if (format == "Gmsh2 Format")
WriteGmsh2Format (mesh, geom, filename);
else if (format == "VTK Format")
WriteVtkFormat (mesh, filename);
// Philippose - 25/10/2009
// Added OpenFOAM 1.5+ Mesh export capability
else if (format == "OpenFOAM 1.5+ Format")

View File

@ -73,6 +73,9 @@ void WriteGmsh2Format (const Mesh & mesh,
const NetgenGeometry & geom,
const filesystem::path & filename);
extern
void WriteVtkFormat (const Mesh & mesh,
const string & filename);
// Philippose - 25/10/2009
// Added OpenFOAM 1.5+ Mesh Export support

View File

@ -0,0 +1,136 @@
/*************************************
* Write Gmsh file
* First issue the 04/26/2004 by Paul CARRICO (paul.carrico@free.fr)
* At the moment, the GMSH format is available for
* linear tetrahedron elements i.e. in 3D
* (based on Neutral Format)
*
* Second issue the 05/05/2004 by Paul CARRICO
* Thanks to Joachim Schoeberl for the correction of a minor bug
* the 2 initial Gmsh Format (i.e. volume format and surface format) are group together)
* in only one file
**************************************/
#include <mystdlib.h>
#include <myadt.hpp>
#include <linalg.hpp>
#include <csg.hpp>
#include <meshing.hpp>
namespace netgen
{
#include "writeuser.hpp"
extern MeshingParameters mparam;
/*
* VTK mesh format
* points, elements, surface elements
*/
void WriteVtkFormat (const Mesh & mesh,
const string & filename)
{
ofstream outfile (filename.c_str());
outfile.precision(6);
outfile.setf (ios::fixed, ios::floatfield);
outfile.setf (ios::showpoint);
int np = mesh.GetNP(); /// number of point
int ne = mesh.GetNE(); /// number of element
int nse = mesh.GetNSE(); /// number of surface element (BC)
outfile << "# vtk DataFile Version 2.0\n";
outfile << "Created with netgen\n";
outfile << "ASCII\n";
outfile << "DATASET UNSTRUCTURED_GRID\n";
outfile << "POINTS " << np << " double\n";
for (int i=0; i<np; i++)
{
auto & p = mesh.Point(i+1);
outfile << p[0] << " " << p[1] << " " << p[2] << "\n";
}
std::vector<int> types;
std::vector<int> domains;
if (ne > 0)
{
unsigned int size = 0;
for (int i=0; i<ne; i++)
size += mesh.VolumeElement(i+1).GetNV() + 1; // only save "linear" corners
outfile << "CELLS " << ne << " " << size << "\n";
for (int i=0; i<ne; i++)
{
auto& el = mesh.VolumeElement(i+1);
domains.push_back(el.GetIndex());
switch (el.GetType())
{
case TET:
case TET10: // reorder to follow VTK convention & zero based indices
outfile << 4 << " " << el[0]-1 << " " << el[1]-1 << " " << el[3]-1 << " " << el[2]-1 << "\n";
types.push_back(10);
break;
case PRISM: // reorder to follow VTK convention & zero based indices
outfile << 6 << " "
<< el[0]-1 << " " << el[2]-1 << " " << el[1]-1 << " "
<< el[3]-1 << " " << el[5]-1 << " " << el[4]-1 << "\n";
types.push_back(13);
break;
default:
throw ngcore::Exception("Unexpected element type");
break;
}
}
}
else
{
unsigned int size = 0;
for (int i=0; i<nse; i++)
size += mesh.SurfaceElement(i+1).GetNV() + 1;
outfile << "CELLS " << nse << " " << size << "\n";
for (int i=0; i<nse; i++)
{
auto& el = mesh.SurfaceElement(i+1);
domains.push_back(el.GetIndex());
switch (el.GetType())
{
case TRIG:
case TRIG6:
outfile << 3 << " " << el[0]-1 << " " << el[1]-1 << " " << el[2]-1 << "\n";
types.push_back(5);
break;
case QUAD:
outfile << 4 << " " << el[0]-1 << " " << el[1]-1 << " " << el[2]-1 << " " << el[3]-1 << "\n";
types.push_back(9);
break;
default:
throw ngcore::Exception("Unexpected element type");
break;
}
}
}
outfile << "CELL_TYPES " << types.size() << "\n";
for (auto type_id: types)
{
outfile << type_id << "\n";
}
outfile << "CELL_DATA " << domains.size() << "\n";
outfile << "SCALARS scalars int 1\n";
outfile << "LOOKUP_TABLE default\n";
for (auto id: domains)
{
outfile << id << "\n";
}
outfile.close();
}
}

1548
nglib/mynglib.cpp Normal file

File diff suppressed because it is too large Load Diff

View File

@ -17,15 +17,15 @@
#include <stlgeom.hpp>
#include <geometry2d.hpp>
#include <meshing.hpp>
#include <../meshing/soldata.hpp>
#include <nginterface.h>
#include <../interface/writeuser.hpp>
namespace netgen {
extern void MeshFromSpline2D (SplineGeometry2d & geometry,
shared_ptr<Mesh> & mesh,
MeshingParameters & mp);
extern void Optimize2d(Mesh & mesh, MeshingParameters & mp);
extern MeshingParameters mparam;
DLL_HEADER extern STLParameters stlparam;
}
@ -37,7 +37,6 @@ namespace netgen {
#endif
/*
namespace netgen
{
@ -56,6 +55,11 @@ namespace netgen {
*/
// Bryn Lloyd - get rid of warning about macro redefinition (previously defined in mydefs.hpp)
#if defined(NGLIB_API)
#undef NGLIB_API
#endif
namespace nglib {
#include "nglib.h"
}
@ -66,19 +70,42 @@ using namespace netgen;
namespace nglib
{
inline void NOOP_Deleter(void *) { ; }
inline void NOOP_Deleter(void *) { ; }
// initialize, deconstruct Netgen library:
NGLIB_API void Ng_Init ()
class NullStreambuf : public std::streambuf
{
mycout = &cout;
myerr = &cerr;
// netgen::testout->SetOutStream (new ofstream ("test.out"));
// testout = new ofstream ("test.out");
char dummyBuffer[64];
protected:
virtual int overflow(int c)
{
setp(dummyBuffer, dummyBuffer + sizeof(dummyBuffer));
return (c == traits_type::eof()) ? '\0' : c;
}
};
// initialize, deconstruct Netgen library:
NGLIB_API void Ng_Init (bool cout_to_null, bool cerr_to_null, bool testout_to_null)
{
static ostream* null_stream = new ostream(new NullStreambuf);
mycout = cout_to_null ? null_stream : &cout;
myerr = cerr_to_null ? null_stream : &cerr;
testout = testout_to_null ? null_stream : new ofstream("test.out");
}
NGLIB_API void Ng_GetStatus(char ** str, double & percent)
{
::netgen::MyStr s;
::netgen::GetStatus(s, percent);
*str = new char[s.Length() + 1];
strcpy(*str, s.c_str());
}
NGLIB_API void Ng_SetTerminate(bool abort)
{
::netgen::multithread.terminate = abort ? 1 : 0;
}
// Clean-up functions before ending usage of nglib
@ -139,6 +166,25 @@ namespace nglib
NGLIB_API void Ng_ExportMesh(Ng_Mesh * ng_mesh, Ng_Export_Formats format, const char* filename)
{
Mesh * mesh = (Mesh*)ng_mesh;
switch (format)
{
case NG_GMSH:
WriteUserFormat( "Gmsh Format", *mesh, filename ); break;
case NG_GMSH2:
WriteUserFormat( "Gmsh2 Format", *mesh, filename ); break;
case NG_VTK:
WriteUserFormat( "VTK Format", *mesh, filename ); break;
case NG_FLUENT:
WriteUserFormat( "Fluent Format", *mesh, filename ); break;
case NG_ABAQUS:
WriteUserFormat( "Abaqus Format", *mesh, filename ); break;
}
}
// Merge another mesh file into the currently loaded one
NGLIB_API Ng_Result Ng_MergeMesh( Ng_Mesh* mesh, const char* filename)
@ -198,18 +244,82 @@ namespace nglib
}
// Manually lock a specific point
NGLIB_API void Ng_AddLockedPoint(Ng_Mesh * mesh, int pi)
{
Mesh * m = (Mesh*)mesh;
m->AddLockedPoint(pi);
}
NGLIB_API void Ng_ClearFaceDescriptors (Ng_Mesh * ng_mesh)
{
Mesh * mesh = (Mesh*)ng_mesh;
mesh->ClearFaceDescriptors();
}
NGLIB_API int Ng_AddFaceDescriptor (Ng_Mesh * ng_mesh, int surfnr, int domin, int domout, int bcp)
{
Mesh * mesh = (Mesh*)ng_mesh;
int nfd = mesh->GetNFD();
int faceind = 0;
for (int j = 1; j <= nfd; j++)
{
if (mesh->GetFaceDescriptor(j).SurfNr() == surfnr
&& mesh->GetFaceDescriptor(j).BCProperty() == bcp
&& mesh->GetFaceDescriptor(j).DomainIn() == domin
&& mesh->GetFaceDescriptor(j).DomainOut() == domout)
{
faceind = j;
break;
}
}
if (!faceind)
{
faceind = mesh->AddFaceDescriptor (FaceDescriptor(surfnr, domin, domout, 0));
mesh->GetFaceDescriptor(faceind).SetBCProperty (bcp);
}
return faceind;
}
NGLIB_API void Ng_SetupFacedescriptors (Ng_Mesh * mesh, int maxbc)
{
Mesh * m = (Mesh*)mesh;
m->ClearFaceDescriptors();
for (int i = 1; i <= maxbc; i++)
m->AddFaceDescriptor (FaceDescriptor (i, 0, 0, i));
}
// Manually add a surface element of a given type to an existing mesh object
NGLIB_API void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et,
int * pi)
int * pi, int facenr)
{
int n = 3;
switch (et)
{
case NG_TRIG:
n = 3; break;
case NG_QUAD:
n = 4; break;
case NG_QUAD6:
n = 6; break;
case NG_TRIG6:
n = 6; break;
case NG_QUAD8:
n = 8; break;
default: break;
}
Mesh * m = (Mesh*)mesh;
Element2d el (3);
el.SetIndex (1);
el.PNum(1) = pi[0];
el.PNum(2) = pi[1];
el.PNum(3) = pi[2];
Element2d el (n);
el.SetIndex (facenr);
for (int i=0; i<n; ++i)
el.PNum(i+1) = pi[i];
m->AddSurfaceElement (el);
}
@ -218,21 +328,33 @@ namespace nglib
// Manually add a volume element of a given type to an existing mesh object
NGLIB_API void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et,
int * pi)
int * pi, int domain)
{
int n = 4;
switch (et)
{
case NG_TET:
n = 4; break;
case NG_PYRAMID:
n = 5; break;
case NG_PRISM:
n = 6; break;
case NG_HEX:
n = 8; break;
case NG_TET10:
n = 10; break;
default: break;
}
Mesh * m = (Mesh*)mesh;
Element el (4);
el.SetIndex (1);
el.PNum(1) = pi[0];
el.PNum(2) = pi[1];
el.PNum(3) = pi[2];
el.PNum(4) = pi[3];
Element el (n);
el.SetIndex (domain);
for (int i=0; i<n; ++i)
el.PNum(i+1) = pi[i];
m->AddVolumeElement (el);
}
// Obtain the number of points in the mesh
NGLIB_API int Ng_GetNP (Ng_Mesh * mesh)
{
@ -270,11 +392,23 @@ namespace nglib
}
NGLIB_API bool Ng_GetFaceDescriptor (Ng_Mesh * mesh, int facenr, int &surfnr, int &domin, int &domout, int &bcp)
{
Mesh * m = (Mesh*)mesh;
if (facenr <= m->GetNFD())
{
surfnr = m->GetFaceDescriptor(facenr).SurfNr();
domin = m->GetFaceDescriptor(facenr).DomainIn();
domout = m->GetFaceDescriptor(facenr).DomainOut();
bcp = m->GetFaceDescriptor(facenr).BCProperty();
return true;
}
return false;
}
// Return the surface element at a given index "pi"
NGLIB_API Ng_Surface_Element_Type
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi)
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi, int * facenr)
{
const Element2d & el = ((Mesh*)mesh)->SurfaceElement(num);
for (int i = 1; i <= el.GetNP(); i++)
@ -297,6 +431,8 @@ namespace nglib
default:
et = NG_TRIG; break; // for the compiler
}
if (facenr)
*facenr = el.GetIndex();
return et;
}
@ -305,7 +441,7 @@ namespace nglib
// Return the volume element at a given index "pi"
NGLIB_API Ng_Volume_Element_Type
Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi)
Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi, int * domain)
{
const Element & el = ((Mesh*)mesh)->VolumeElement(num);
for (int i = 1; i <= el.GetNP(); i++)
@ -316,10 +452,13 @@ namespace nglib
case 4: et = NG_TET; break;
case 5: et = NG_PYRAMID; break;
case 6: et = NG_PRISM; break;
case 8: et = NG_HEX; break;
case 10: et = NG_TET10; break;
default:
et = NG_TET; break; // for the compiler
}
if (domain)
*domain = el.GetIndex();
return et;
}
@ -379,6 +518,24 @@ namespace nglib
// Optimize existing mesh
NGLIB_API Ng_Result Ng_OptimizeVolume(Ng_Mesh *mesh, Ng_Meshing_Parameters *mp)
{
Mesh * m = (Mesh*)mesh;
mp->Transfer_Parameters();
m->CalcLocalH(mparam.grading);
RemoveIllegalElements(*m);
OptimizeVolume(mparam, *m);
return NG_OK;
}
/* ------------------ 2D Meshing Functions ------------------------- */
NGLIB_API void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x)
{
@ -390,14 +547,16 @@ namespace nglib
NGLIB_API void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2)
NGLIB_API void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2, int domain_in, int domain_out)
{
Mesh * m = (Mesh*)mesh;
Segment seg;
seg[0] = pi1;
seg[1] = pi2;
m->AddSegment (seg);
seg.domin = domain_in;
seg.domout = domain_out;
m->AddSegment(seg);
}
@ -498,6 +657,73 @@ namespace nglib
}
NGLIB_API Ng_Geometry_2D * Ng_NewGeometry_2D ()
{
SplineGeometry2d * geom = new SplineGeometry2d();
return (Ng_Geometry_2D *)geom;
}
NGLIB_API void Ng_DeleteGeometry_2D (Ng_Geometry_2D * geom)
{
if (geom)
{
SplineGeometry2d* spline_geom = (SplineGeometry2d*)geom;
delete spline_geom;
geom = NULL;
}
}
NGLIB_API void Ng_AppendPoint_2D (Ng_Geometry_2D* geom, double * x, double h)
{
if (geom)
{
SplineGeometry2d* spline_geom = (SplineGeometry2d*)geom;
Point<2> p(x[0],x[1]);
spline_geom->AppendPoint(p, h);
}
}
NGLIB_API void Ng_AppendLineSegment_2D (Ng_Geometry_2D* geom, int n1, int n2,
int leftdomain, int rightdomain, double h)
{
if (geom)
{
SplineGeometry2d* spline_geom = (SplineGeometry2d*)geom;
// zero-offset!
LineSeg<2>* line = new LineSeg<2>(spline_geom->geompoints[n1-1], spline_geom->geompoints[n2-1]);
SplineSegExt* seg = new SplineSegExt(*line);
seg->leftdom = leftdomain;
seg->rightdom = rightdomain;
seg->hmax = h;
seg->copyfrom = -1;
seg->bc = 1;
spline_geom->AppendSegment(seg);
}
}
NGLIB_API void Ng_AppendSplinSegment_2D (Ng_Geometry_2D* geom, int n1, int n2, int n3,
int leftdomain, int rightdomain, double h)
{
if (geom)
{
SplineGeometry2d* spline_geom = (SplineGeometry2d*)geom;
// zero-offset!
NgArray<Point<2> > pts;
pts.Append(spline_geom->geompoints[n1-1]);
pts.Append(spline_geom->geompoints[n2-1]);
pts.Append(spline_geom->geompoints[n3-1]);
auto line = new BSplineSeg<2,3>(pts);
//SplineSeg3<2>* line = new SplineSeg3<2>(spline_geom->geompoints[n1-1], spline_geom->geompoints[n2-1], spline_geom->geompoints[n3-1]);
SplineSegExt* seg = new SplineSegExt(*line);
seg->leftdom = leftdomain;
seg->rightdom = rightdomain;
seg->hmax = h;
seg->copyfrom = -1;
seg->bc = 1;
spline_geom->AppendSegment(seg);
}
}
NGLIB_API Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
Ng_Mesh ** mesh,
Ng_Meshing_Parameters * mp)
@ -508,15 +734,24 @@ namespace nglib
shared_ptr<Mesh> m(new Mesh, &NOOP_Deleter);
MeshFromSpline2D (*(SplineGeometry2d*)geom, m, mparam);
// new shared_ptr<Mesh> (m); // hack to keep mesh m alive
cout << m->GetNSE() << " elements, " << m->GetNP() << " points" << endl;
*mesh = (Ng_Mesh*)m.get();
return NG_OK;
}
NGLIB_API Ng_Result Ng_OptimizeMesh_2D(Ng_Mesh *mesh, Ng_Meshing_Parameters * mp)
{
Mesh * m = (Mesh*)mesh;
mp->Transfer_Parameters();
m->CalcLocalH(mparam.grading);
Optimize2d(*m, mparam);
return NG_OK;
}
NGLIB_API void Ng_HP_Refinement (Ng_Geometry_2D * geom,
@ -601,6 +836,16 @@ namespace nglib
}
NGLIB_API void Ng_STL_DeleteGeometry (Ng_STL_Geometry * geom)
{
if (geom)
{
STLGeometry* geometry = (STLGeometry*)geom;
geometry->Clear();
delete geometry;
geometry = NULL;
}
}
// after adding triangles (and edges) initialize
@ -631,7 +876,8 @@ namespace nglib
// automatically generates edges:
NGLIB_API Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
Ng_Mesh* mesh,
Ng_Meshing_Parameters * mp)
Ng_Meshing_Parameters * mp,
Ng_STL_Parameters * stlp)
{
STLGeometry* stlgeometry = (STLGeometry*)geom;
Mesh* me = (Mesh*)mesh;
@ -642,6 +888,7 @@ namespace nglib
// object
//MeshingParameters mparam;
mp->Transfer_Parameters();
if (stlp) stlp->Transfer_Parameters();
me -> SetGlobalH (mparam.maxh);
me -> SetLocalH (stlgeometry->GetBoundingBox().PMin() - Vec3d(10, 10, 10),
@ -677,7 +924,8 @@ namespace nglib
// generates mesh, empty mesh be already created.
NGLIB_API Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
Ng_Mesh* mesh,
Ng_Meshing_Parameters * mp)
Ng_Meshing_Parameters * mp,
Ng_STL_Parameters * stlp)
{
STLGeometry* stlgeometry = (STLGeometry*)geom;
Mesh* me = (Mesh*)mesh;
@ -688,6 +936,7 @@ namespace nglib
// object
//MeshingParameters mparam;
mp->Transfer_Parameters();
if (stlp) stlp->Transfer_Parameters();
/*
@ -787,9 +1036,9 @@ namespace nglib
closeedgeenable = 0;
closeedgefact = 2.0;
minedgelenenable = 0;
minedgelen = 1e-4;
minedgelenenable = 0;
minedgelen = 1e-4;
second_order = 0;
quad_dominated = 0;
@ -801,6 +1050,9 @@ namespace nglib
optsteps_2d = 3;
optsteps_3d = 3;
optimize3d = "cmdmustm";
optimize2d = "smsmsmSmSmSm";
invert_tets = 0;
invert_trigs = 0;
@ -815,39 +1067,7 @@ namespace nglib
// Reset the local meshing parameters to the default values
NGLIB_API void Ng_Meshing_Parameters :: Reset_Parameters()
{
uselocalh = 1;
maxh = 1000;
minh = 0;
fineness = 0.5;
grading = 0.3;
elementsperedge = 2.0;
elementspercurve = 2.0;
closeedgeenable = 0;
closeedgefact = 2.0;
minedgelenenable = 0;
minedgelen = 1e-4;
second_order = 0;
quad_dominated = 0;
meshsize_filename = 0;
optsurfmeshenable = 1;
optvolmeshenable = 1;
optsteps_2d = 3;
optsteps_3d = 3;
invert_tets = 0;
invert_trigs = 0;
check_overlap = 1;
check_overlapping_boundary = 1;
(*this) = Ng_Meshing_Parameters();
}
@ -874,6 +1094,9 @@ namespace nglib
mparam.meshsizefilename = "";
mparam.optsteps2d = optsteps_2d;
mparam.optsteps3d = optsteps_3d;
if (strlen(optimize2d) > 0) mparam.optimize2d = optimize2d;
if (strlen(optimize3d) > 0) mparam.optimize3d = optimize3d;
mparam.inverttets = invert_tets;
mparam.inverttrigs = invert_trigs;
@ -881,6 +1104,72 @@ namespace nglib
mparam.checkoverlap = check_overlap;
mparam.checkoverlappingboundary = check_overlapping_boundary;
}
NGLIB_API Ng_STL_Parameters :: Ng_STL_Parameters()
{
yangle = 30;
contyangle = 20;
chartangle = 10; // original = 15
outerchartangle = 80; // original = 70;
usesearchtree = 0;
atlasminh = 1.0; // original = 1E-4
resthatlasenable = 1;
resthatlasfac = 2;
resthchartdistenable = 1;
resthchartdistfac = 0.3; // original = 1.2
resthedgeangleenable = 0;
resthedgeanglefac = 1;
resthsurfmeshcurvenable = 1;
resthsurfmeshcurvfac = 1;
resthlinelengthenable = 1;
resthlinelengthfac = 0.2; // original = 0.5
resthcloseedgefac = 1;
resthcloseedgeenable = 1;
}
NGLIB_API void Ng_STL_Parameters :: Transfer_Parameters()
{
stlparam.yangle = yangle;
stlparam.contyangle = contyangle;
stlparam.chartangle = chartangle;
stlparam.outerchartangle = outerchartangle;
stlparam.usesearchtree = usesearchtree;
stlparam.atlasminh = atlasminh;
stlparam.resthatlasenable = resthatlasenable;
stlparam.resthatlasfac = resthatlasfac;
stlparam.resthchartdistenable = resthchartdistenable;
stlparam.resthchartdistfac = resthchartdistfac;
stlparam.resthedgeangleenable = resthedgeangleenable;
stlparam.resthedgeanglefac = resthedgeanglefac;
stlparam.resthsurfmeshcurvenable = resthsurfmeshcurvenable;
stlparam.resthsurfmeshcurvfac = resthsurfmeshcurvfac;
stlparam.resthlinelengthenable = resthlinelengthenable;
stlparam.resthlinelengthfac = resthlinelengthfac;
// stlparam.resthcloseedgeenable = resthcloseedgeenable;
// stlparam.resthcloseedgefac = resthcloseedgefac;
}
// ------------------ End - Meshing Parameters related functions --------------------
@ -897,7 +1186,7 @@ namespace nglib
NGLIB_API void Ng_2D_Generate_SecondOrder(Ng_Geometry_2D * geom,
Ng_Mesh * mesh)
Ng_Mesh * mesh)
{
( (SplineGeometry2d*)geom ) -> GetRefinement().MakeSecondOrder( * (Mesh*) mesh );
}
@ -906,7 +1195,7 @@ namespace nglib
NGLIB_API void Ng_STL_Generate_SecondOrder(Ng_STL_Geometry * geom,
Ng_Mesh * mesh)
Ng_Mesh * mesh)
{
((STLGeometry*)geom)->GetRefinement().MakeSecondOrder(*(Mesh*) mesh);
}
@ -915,7 +1204,7 @@ namespace nglib
NGLIB_API void Ng_CSG_Generate_SecondOrder (Ng_CSG_Geometry * geom,
Ng_Mesh * mesh)
Ng_Mesh * mesh)
{
((CSGeometry*)geom)->GetRefinement().MakeSecondOrder(*(Mesh*) mesh);
}
@ -931,11 +1220,56 @@ namespace nglib
// ------------------ Begin - Uniform Mesh Refinement functions ---------------------
NGLIB_API void Ng_Uniform_Refinement (Ng_Mesh * mesh)
{
Refinement ref(*((Mesh*)mesh)->GetGeometry());
ref.Refine ( * (Mesh*) mesh );
Refinement ref(*((Mesh*)mesh)->GetGeometry());
ref.Refine ( * (Mesh*) mesh );
}
NGLIB_API void Ng_SetRefinementFlag (Ng_Mesh * ng_mesh, int ei, int flag)
{
Mesh * mesh = (Mesh*) ng_mesh;
if (mesh->GetDimension() == 3)
{
mesh->VolumeElement(ei).SetRefinementFlag (flag != 0);
mesh->VolumeElement(ei).SetStrongRefinementFlag (flag >= 10);
}
else
{
mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);
mesh->SurfaceElement(ei).SetStrongRefinementFlag (flag >= 10);
}
}
NGLIB_API void Ng_SetSurfaceRefinementFlag (Ng_Mesh * ng_mesh, int ei, int flag)
{
Mesh * mesh = (Mesh*) ng_mesh;
if (mesh->GetDimension() == 3)
{
mesh->SurfaceElement(ei).SetRefinementFlag (flag != 0);
mesh->SurfaceElement(ei).SetStrongRefinementFlag (flag >= 10);
}
}
NGLIB_API void Ng_Refine (Ng_Mesh * ng_mesh)
{
Mesh * mesh = (Mesh*) ng_mesh;
BisectionOptions biopt;
biopt.usemarkedelements = 1;
biopt.refine_p = 0; // only h-refinement
biopt.refine_hp = 0;
Refinement ref(*((Mesh*)mesh)->GetGeometry());
ref.Bisect(*(Mesh*)mesh, biopt);
// \todo not sure if this is needed?
//mesh -> UpdateTopology();
//mesh -> GetCurvedElements().SetIsHighOrder (false);
}
NGLIB_API void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
@ -946,7 +1280,6 @@ namespace nglib
NGLIB_API void Ng_STL_Uniform_Refinement (Ng_STL_Geometry * geom,
Ng_Mesh * mesh)
{
@ -1037,11 +1370,3 @@ void Ng_SetSolutionData (Ng_SolutionData * soldata)
}
void Ng_InitSolutionData (Ng_SolutionData * soldata) { ; }
*/
// Force linking libinterface to libnglib
#include <../interface/writeuser.hpp>
void MyDummyToForceLinkingLibInterface(Mesh &mesh, NetgenGeometry &geom)
{
netgen::WriteUserFormat("", mesh, /* geom, */ "");
}

View File

@ -25,8 +25,8 @@
// Philippose - 14.02.2009
// Modifications for creating a DLL in Windows
#ifdef WIN32
#ifdef nglib_EXPORTS
#if defined(WIN32)
#if defined(NGLIB_EXPORTS) || defined(nglib_EXPORTS)
#define NGLIB_API __declspec(dllexport)
#else
#define NGLIB_API __declspec(dllimport)
@ -67,7 +67,7 @@ enum Ng_Surface_Element_Type
/// Currently implemented volume element types
enum Ng_Volume_Element_Type
{ NG_TET = 1, NG_PYRAMID = 2, NG_PRISM = 3, NG_TET10 = 4 };
{ NG_TET = 1, NG_PYRAMID = 2, NG_PRISM = 3, NG_TET10 = 4, NG_HEX = 5 };
/// Values returned by Netgen functions
enum Ng_Result
@ -116,6 +116,9 @@ public:
int optsteps_3d; //!< Number of optimize steps to use for 3-D mesh optimization
int optsteps_2d; //!< Number of optimize steps to use for 2-D mesh optimization
const char* optimize3d; //!< Optimization strategy (s=swap shape, c=collapse, d=divide, m=move, M=cheap move)
const char* optimize2d; //!< Optimization strategy (s=swap topological, S=swap shape, c=collapse, m=move)
// Philippose - 13/09/2010
// Added a couple more parameters into the meshing parameters list
// from Netgen into Nglib
@ -176,6 +179,49 @@ public:
};
class NGLIB_API Ng_STL_Parameters
{
public:
// Algorithm may be somewhat like Canny edge detector
// on mesh?
double yangle; // 30
double contyangle; // 30
// I think this is used to split surface into patches/charts,
//which are flattened to use 2d meshing routines.
double chartangle; // 15
double outerchartangle; // 70
int usesearchtree; // 0
double atlasminh; // 1e-4
// Factors which influence the local mesh size
// as a relation to some metric, e.g. curvature,
// line length, etc.
// TODO: document each of these properly
int resthatlasenable; // 1
double resthatlasfac; // 2
int resthchartdistenable; // 1
double resthchartdistfac; // 0.3
int resthedgeangleenable; // 0
double resthedgeanglefac; // 1
int resthsurfmeshcurvenable; // 0
double resthsurfmeshcurvfac; // 0.5
int resthlinelengthenable; // 1
double resthlinelengthfac; // 0.5
int resthcloseedgeenable; // 1
double resthcloseedgefac; // 1.0
Ng_STL_Parameters();
void Transfer_Parameters();
};
// *** Functions Exported by this Library *************
@ -189,7 +235,7 @@ public:
program before beginning to use the other Netgen
specific functions.
*/
NGLIB_API void Ng_Init ();
NGLIB_API void Ng_Init (bool cout_to_null = false, bool cerr_to_null = false, bool testout_to_null = false);
/*! \brief Exit the Netgen meshing kernel in a clean manner
@ -200,6 +246,16 @@ NGLIB_API void Ng_Init ();
NGLIB_API void Ng_Exit ();
/*! \brief Get current status, e.g. info string and percent
*/
NGLIB_API void Ng_GetStatus(char ** str, double & percent);
/*! \brief Set abort flag
*/
NGLIB_API void Ng_SetTerminate(bool abort);
/*! \brief Create a new (and empty) Netgen Mesh Structure
This function creates a new Netgen Mesh, initialises
@ -254,6 +310,13 @@ NGLIB_API void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename);
NGLIB_API Ng_Mesh * Ng_LoadMesh(const char* filename);
/*! \brief Save mesh in various external formats, e.g. fluent, gmsh, gmsh2, vtk, ...
*/
enum Ng_Export_Formats { NG_GMSH = 1, NG_GMSH2 = 2, NG_VTK = 3, NG_FLUENT = 4, NG_ABAQUS = 5 };
NGLIB_API void Ng_ExportMesh(Ng_Mesh * mesh, Ng_Export_Formats format, const char* filename);
/*! \brief Merge a Netgen VOL Mesh from disk into an existing mesh in memory
A Netgen mesh saved in the internal VOL format can be merged
@ -308,6 +371,27 @@ NGLIB_API Ng_Result Ng_MergeMesh(Ng_Mesh * mesh1, Ng_Mesh * mesh2);
NGLIB_API void Ng_AddPoint (Ng_Mesh * mesh, double * x);
/*! Add locked point which should not get modified by optimization routines
*/
NGLIB_API void Ng_AddLockedPoint(Ng_Mesh * mesh, int pi);
/*! \brief Remove any existing face descriptors
*/
NGLIB_API int Ng_AddFaceDescriptor (Ng_Mesh * ng_mesh, int surfnr, int domin, int domout, int bcp);
/*! \brief Remove any existing face descriptors
*/
NGLIB_API void Ng_ClearFaceDescriptors (Ng_Mesh * ng_mesh);
/*! \brief Generate simple facedescriptors, with facenr==bc, from 1...maxbc
*/
NGLIB_API void Ng_SetupFacedescriptors(Ng_Mesh * mesh, int maxbc);
/*! \brief Add a surface element to a given Netgen Mesh Structure
This function allows the top-level code to directly add individual
@ -327,8 +411,9 @@ NGLIB_API void Ng_AddPoint (Ng_Mesh * mesh, double * x);
#Ng_Surface_Element_Type
\param pi Pointer to an array of integers containing the indices of the
points which constitute the surface element being added
\param facenr Index of face descriptor. Used e.g. to attach boundary condition types to surface elements
*/
NGLIB_API void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi);
NGLIB_API void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et, int * pi, int facenr=1);
/*! \brief Add a volume element to a given Netgen Mesh Structure
@ -352,8 +437,8 @@ NGLIB_API void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et,
points which constitute the volume element being added
*/
NGLIB_API void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi);
NGLIB_API void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi, int domain=1);
// ------------------------------------------------------------------
@ -467,6 +552,12 @@ NGLIB_API void Ng_RestrictMeshSizeBox (Ng_Mesh * mesh, double * pmin, double * p
*/
NGLIB_API Ng_Result Ng_GenerateVolumeMesh (Ng_Mesh * mesh, Ng_Meshing_Parameters * mp);
/*! \brief Improve quality of an existing 3D Volume Mesh
*/
NGLIB_API Ng_Result Ng_OptimizeVolume(Ng_Mesh *mesh, Ng_Meshing_Parameters *mp);
// ------------------------------------------------------------------
@ -529,13 +620,15 @@ NGLIB_API int Ng_GetNE (Ng_Mesh * mesh);
NGLIB_API void Ng_GetPoint (Ng_Mesh * mesh, int num, double * x);
// return bcp and surfnr for specified face descriptor (facenr)
NGLIB_API bool Ng_GetFaceDescriptor (Ng_Mesh * mesh, int facenr, int &surfnr, int &domin, int &domout, int &bcp);
// return surface and volume element in pi
NGLIB_API Ng_Surface_Element_Type
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi);
Ng_GetSurfaceElement (Ng_Mesh * mesh, int num, int * pi, int * facenr = nullptr);
NGLIB_API Ng_Volume_Element_Type
Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi);
Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi, int * domain = nullptr);
// ------------------------------------------------------------------
@ -548,9 +641,20 @@ Ng_GetVolumeElement (Ng_Mesh * mesh, int num, int * pi);
// feeds points and boundary to mesh
NGLIB_API Ng_Geometry_2D * Ng_NewGeometry_2D();
NGLIB_API void Ng_DeleteGeometry_2D(Ng_Geometry_2D * geom);
NGLIB_API void Ng_AppendPoint_2D(Ng_Geometry_2D* geom, double * x, double h);
NGLIB_API void Ng_AppendLineSegment_2D(Ng_Geometry_2D* geom, int pi1, int pi2,
int leftdomain, int rightdomain, double h);
NGLIB_API void Ng_AppendSplinSegment_2D(Ng_Geometry_2D* geom, int pi1, int pi2, int pi3,
int leftdomain, int rightdomain, double h);
NGLIB_API void Ng_AddPoint_2D (Ng_Mesh * mesh, double * x);
NGLIB_API void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2);
NGLIB_API void Ng_AddBoundarySeg_2D (Ng_Mesh * mesh, int pi1, int pi2, int domain_in = -1, int domain_out = -1);
// ask for number of points, elements and boundary segments
NGLIB_API int Ng_GetNP_2D (Ng_Mesh * mesh);
@ -561,11 +665,10 @@ NGLIB_API int Ng_GetNSeg_2D (Ng_Mesh * mesh);
NGLIB_API void Ng_GetPoint_2D (Ng_Mesh * mesh, int num, double * x);
// return 2d elements
NGLIB_API Ng_Surface_Element_Type
Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL);
NGLIB_API Ng_Surface_Element_Type Ng_GetElement_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = nullptr);
// return 2d boundary segment
NGLIB_API void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = NULL);
NGLIB_API void Ng_GetSegment_2D (Ng_Mesh * mesh, int num, int * pi, int * matnum = nullptr);
// load 2d netgen spline geometry
@ -575,7 +678,11 @@ NGLIB_API Ng_Geometry_2D * Ng_LoadGeometry_2D (const char * filename);
NGLIB_API Ng_Result Ng_GenerateMesh_2D (Ng_Geometry_2D * geom,
Ng_Mesh ** mesh,
Ng_Meshing_Parameters * mp);
// functions added to make Optimize2d mesh accessible from nglib
NGLIB_API Ng_Result Ng_OptimizeMesh_2D(Ng_Mesh *mesh, Ng_Meshing_Parameters * mp);
NGLIB_API void Ng_HP_Refinement (Ng_Geometry_2D * geom,
Ng_Mesh * mesh,
int levels);
@ -595,14 +702,16 @@ NGLIB_API Ng_STL_Geometry * Ng_STL_LoadGeometry (const char * filename, int bina
// generate new STL Geometry
NGLIB_API Ng_STL_Geometry * Ng_STL_NewGeometry ();
NGLIB_API void Ng_STL_DeleteGeometry (Ng_STL_Geometry * geom);
// fills STL Geometry
// positive orientation
// normal vector may be null-pointer
NGLIB_API void Ng_STL_AddTriangle (Ng_STL_Geometry * geom,
double * p1, double * p2, double * p3,
double * nv = NULL);
double * nv = nullptr);
// add (optional) edges :
NGLIB_API void Ng_STL_AddEdge (Ng_STL_Geometry * geom,
@ -614,13 +723,15 @@ NGLIB_API Ng_Result Ng_STL_InitSTLGeometry (Ng_STL_Geometry * geom);
// automatically generates edges:
NGLIB_API Ng_Result Ng_STL_MakeEdges (Ng_STL_Geometry * geom,
Ng_Mesh* mesh,
Ng_Meshing_Parameters * mp);
Ng_Meshing_Parameters * mp,
Ng_STL_Parameters * stlp = nullptr);
// generates mesh, empty mesh must be already created.
NGLIB_API Ng_Result Ng_STL_GenerateSurfaceMesh (Ng_STL_Geometry * geom,
Ng_Mesh * mesh,
Ng_Meshing_Parameters * mp);
Ng_Meshing_Parameters * mp,
Ng_STL_Parameters * stlp = nullptr);
#ifdef ACIS
@ -656,6 +767,14 @@ NGLIB_API Ng_Result Ng_ACIS_GenerateSurfaceMesh (Ng_ACIS_Geometry * geom,
NGLIB_API void Ng_Uniform_Refinement (Ng_Mesh * mesh);
// non-uniform mesh refinement
NGLIB_API void Ng_SetRefinementFlag (Ng_Mesh * ng_mesh, int ei, int flag);
NGLIB_API void Ng_SetSurfaceRefinementFlag (Ng_Mesh * ng_mesh, int ei, int flag);
NGLIB_API void Ng_Refine (Ng_Mesh * ng_mesh);
// uniform mesh refinement with geometry adaption:
NGLIB_API void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,