mirror of
https://github.com/NGSolve/netgen.git
synced 2025-05-07 19:20:48 +05:00
Merge 9d8da1560435d87c65ed775663e235ca901cfb99 into 971f7c6b073e67b183fa405f2f97f2f35cc8b301
This commit is contained in:
commit
650fa0eb28
@ -23,7 +23,7 @@ namespace ngcore
|
||||
}
|
||||
|
||||
static bool dummy = [](){
|
||||
SetLibraryVersion("netgen", NETGEN_VERSION);
|
||||
SetLibraryVersion("netgen", VersionInfo(NETGEN_VERSION));
|
||||
return true;
|
||||
}();
|
||||
} // namespace ngcore
|
||||
|
@ -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)) { }
|
||||
|
||||
|
@ -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
|
||||
)
|
||||
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
136
libsrc/interface/writevtk.cpp
Normal file
136
libsrc/interface/writevtk.cpp
Normal 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
1548
nglib/mynglib.cpp
Normal file
File diff suppressed because it is too large
Load Diff
497
nglib/nglib.cpp
497
nglib/nglib.cpp
@ -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, */ "");
|
||||
}
|
||||
|
||||
|
155
nglib/nglib.h
155
nglib/nglib.h
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user