mirror of
https://github.com/NGSolve/netgen.git
synced 2025-05-12 05:30:49 +05:00
add support for exporting mesh to user file format (at least some of the formats available internally)
This commit is contained in:
parent
63d1380bdb
commit
227d297f78
@ -3,7 +3,7 @@ add_library(interface ${NG_LIB_TYPE}
|
|||||||
nginterface.cpp nginterface_v2.cpp
|
nginterface.cpp nginterface_v2.cpp
|
||||||
read_fnf_mesh.cpp readtetmesh.cpp readuser.cpp writeabaqus.cpp writediffpack.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
|
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
|
wuchemnitz.cpp writegmsh2.cpp writeOpenFOAM15x.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -39,8 +39,9 @@ namespace netgen
|
|||||||
"VRML Format", ".*",
|
"VRML Format", ".*",
|
||||||
"Gmsh Format", ".gmsh",
|
"Gmsh Format", ".gmsh",
|
||||||
"Gmsh2 Format", ".gmsh2",
|
"Gmsh2 Format", ".gmsh2",
|
||||||
|
"VTK Format", ".vtk",
|
||||||
"OpenFOAM 1.5+ Format", "*",
|
"OpenFOAM 1.5+ Format", "*",
|
||||||
"OpenFOAM 1.5+ Compressed", "*",
|
"OpenFOAM 1.5+ Compressed", "*",
|
||||||
"JCMwave Format", ".jcm",
|
"JCMwave Format", ".jcm",
|
||||||
"TET Format", ".tet",
|
"TET Format", ".tet",
|
||||||
// { "Chemnitz Format" },
|
// { "Chemnitz Format" },
|
||||||
@ -128,6 +129,9 @@ bool WriteUserFormat (const string & format,
|
|||||||
else if (format == "Gmsh2 Format")
|
else if (format == "Gmsh2 Format")
|
||||||
WriteGmsh2Format (mesh, geom, filename);
|
WriteGmsh2Format (mesh, geom, filename);
|
||||||
|
|
||||||
|
else if (format == "VTK Format")
|
||||||
|
WriteVtkFormat (mesh, filename);
|
||||||
|
|
||||||
// Philippose - 25/10/2009
|
// Philippose - 25/10/2009
|
||||||
// Added OpenFOAM 1.5+ Mesh export capability
|
// Added OpenFOAM 1.5+ Mesh export capability
|
||||||
else if (format == "OpenFOAM 1.5+ Format")
|
else if (format == "OpenFOAM 1.5+ Format")
|
||||||
|
@ -73,6 +73,9 @@ void WriteGmsh2Format (const Mesh & mesh,
|
|||||||
const NetgenGeometry & geom,
|
const NetgenGeometry & geom,
|
||||||
const string & filename);
|
const string & filename);
|
||||||
|
|
||||||
|
extern
|
||||||
|
void WriteVtkFormat (const Mesh & mesh,
|
||||||
|
const string & filename);
|
||||||
|
|
||||||
// Philippose - 25/10/2009
|
// Philippose - 25/10/2009
|
||||||
// Added OpenFOAM 1.5+ Mesh Export support
|
// Added OpenFOAM 1.5+ Mesh Export support
|
||||||
|
124
libsrc/interface/writevtk.cpp
Normal file
124
libsrc/interface/writevtk.cpp
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*************************************
|
||||||
|
* 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;
|
||||||
|
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);
|
||||||
|
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<ne; 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);
|
||||||
|
switch (el.GetType())
|
||||||
|
{
|
||||||
|
case TRIG:
|
||||||
|
case TRIG6:
|
||||||
|
outfile << el[0]-1 << " " << el[1]-1 << " " << el[2]-1 << "\n";
|
||||||
|
types.push_back(5);
|
||||||
|
break;
|
||||||
|
case QUAD:
|
||||||
|
outfile << el[0]-1 << " " << el[1]-1 << " " << el[2]-1 << " " << el[3]-1 << "\n";
|
||||||
|
types.push_back(9);
|
||||||
|
default:
|
||||||
|
throw ngcore::Exception("Unexpected element type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
outfile << "CELL_TYPES " << types.size() << "\n";
|
||||||
|
for (auto type_id: types)
|
||||||
|
{
|
||||||
|
outfile << type_id << "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
outfile.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
|||||||
#include <geometry2d.hpp>
|
#include <geometry2d.hpp>
|
||||||
#include <meshing.hpp>
|
#include <meshing.hpp>
|
||||||
#include <../visualization/soldata.hpp>
|
#include <../visualization/soldata.hpp>
|
||||||
|
#include <../interface/writeuser.hpp>
|
||||||
|
|
||||||
#ifdef OCCGEOMETRY
|
#ifdef OCCGEOMETRY
|
||||||
#include <occgeom.hpp>
|
#include <occgeom.hpp>
|
||||||
@ -154,6 +155,25 @@ namespace nglib
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DLL_HEADER 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
|
// Merge another mesh file into the currently loaded one
|
||||||
DLL_HEADER Ng_Result Ng_MergeMesh( Ng_Mesh* mesh, const char* filename)
|
DLL_HEADER Ng_Result Ng_MergeMesh( Ng_Mesh* mesh, const char* filename)
|
||||||
@ -265,6 +285,8 @@ namespace nglib
|
|||||||
n = 5; break;
|
n = 5; break;
|
||||||
case NG_PRISM:
|
case NG_PRISM:
|
||||||
n = 6; break;
|
n = 6; break;
|
||||||
|
case NG_HEX:
|
||||||
|
n = 8; break;
|
||||||
case NG_TET10:
|
case NG_TET10:
|
||||||
n = 10; break;
|
n = 10; break;
|
||||||
default: break;
|
default: break;
|
||||||
@ -279,8 +301,6 @@ namespace nglib
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Obtain the number of points in the mesh
|
// Obtain the number of points in the mesh
|
||||||
DLL_HEADER int Ng_GetNP (Ng_Mesh * mesh)
|
DLL_HEADER int Ng_GetNP (Ng_Mesh * mesh)
|
||||||
{
|
{
|
||||||
@ -366,6 +386,7 @@ namespace nglib
|
|||||||
case 4: et = NG_TET; break;
|
case 4: et = NG_TET; break;
|
||||||
case 5: et = NG_PYRAMID; break;
|
case 5: et = NG_PYRAMID; break;
|
||||||
case 6: et = NG_PRISM; break;
|
case 6: et = NG_PRISM; break;
|
||||||
|
case 8: et = NG_HEX; break;
|
||||||
case 10: et = NG_TET10; break;
|
case 10: et = NG_TET10; break;
|
||||||
default:
|
default:
|
||||||
et = NG_TET; break; // for the compiler
|
et = NG_TET; break; // for the compiler
|
||||||
@ -1202,6 +1223,53 @@ namespace nglib
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (auto geom = mesh->GetGeometry())
|
||||||
|
geom->GetRefinement().Bisect (*mesh, biopt);
|
||||||
|
else
|
||||||
|
Refinement().Bisect (*mesh, biopt);
|
||||||
|
|
||||||
|
// not sure if this is needed?
|
||||||
|
//mesh -> UpdateTopology();
|
||||||
|
//mesh -> GetCurvedElements().SetIsHighOrder (false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
|
DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
|
||||||
@ -1212,7 +1280,6 @@ namespace nglib
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
DLL_HEADER void Ng_STL_Uniform_Refinement (Ng_STL_Geometry * geom,
|
DLL_HEADER void Ng_STL_Uniform_Refinement (Ng_STL_Geometry * geom,
|
||||||
Ng_Mesh * mesh)
|
Ng_Mesh * mesh)
|
||||||
{
|
{
|
||||||
@ -1312,7 +1379,6 @@ void Ng_InitSolutionData (Ng_SolutionData * soldata) { ; }
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Force linking libinterface to libnglib
|
// Force linking libinterface to libnglib
|
||||||
#include <../interface/writeuser.hpp>
|
|
||||||
void MyDummyToForceLinkingLibInterface(Mesh &mesh, NetgenGeometry &geom)
|
void MyDummyToForceLinkingLibInterface(Mesh &mesh, NetgenGeometry &geom)
|
||||||
{
|
{
|
||||||
netgen::WriteUserFormat("", mesh, /* geom, */ "");
|
netgen::WriteUserFormat("", mesh, /* geom, */ "");
|
||||||
|
@ -71,7 +71,7 @@ enum Ng_Surface_Element_Type
|
|||||||
|
|
||||||
/// Currently implemented volume element types
|
/// Currently implemented volume element types
|
||||||
enum Ng_Volume_Element_Type
|
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
|
/// Values returned by Netgen functions
|
||||||
enum Ng_Result
|
enum Ng_Result
|
||||||
@ -258,6 +258,13 @@ DLL_HEADER void Ng_SaveMesh(Ng_Mesh * mesh, const char* filename);
|
|||||||
DLL_HEADER Ng_Mesh * Ng_LoadMesh(const char* filename);
|
DLL_HEADER 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 };
|
||||||
|
DLL_HEADER 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
|
/*! \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
|
A Netgen mesh saved in the internal VOL format can be merged
|
||||||
@ -362,7 +369,7 @@ DLL_HEADER void Ng_AddSurfaceElement (Ng_Mesh * mesh, Ng_Surface_Element_Type et
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
DLL_HEADER void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi, int domain=1);
|
DLL_HEADER void Ng_AddVolumeElement (Ng_Mesh * mesh, Ng_Volume_Element_Type et, int * pi, int domain=1);
|
||||||
|
|
||||||
// ------------------------------------------------------------------
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
@ -712,6 +719,14 @@ DLL_HEADER Ng_Result Ng_OCC_GetFMap(Ng_OCC_Geometry * geom,
|
|||||||
DLL_HEADER void Ng_Uniform_Refinement (Ng_Mesh * mesh);
|
DLL_HEADER void Ng_Uniform_Refinement (Ng_Mesh * mesh);
|
||||||
|
|
||||||
|
|
||||||
|
// non-uniform mesh refinement
|
||||||
|
DLL_HEADER void Ng_SetRefinementFlag (Ng_Mesh * ng_mesh, int ei, int flag);
|
||||||
|
|
||||||
|
DLL_HEADER void Ng_SetSurfaceRefinementFlag (Ng_Mesh * ng_mesh, int ei, int flag);
|
||||||
|
|
||||||
|
DLL_HEADER void Ng_Refine (Ng_Mesh * ng_mesh);
|
||||||
|
|
||||||
|
|
||||||
// uniform mesh refinement with geometry adaption:
|
// uniform mesh refinement with geometry adaption:
|
||||||
|
|
||||||
DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
|
DLL_HEADER void Ng_2D_Uniform_Refinement (Ng_Geometry_2D * geom,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user