Commit c6c14ba3 by Christophe Geuzaine

Merge branch 'gambit-output' into 'master'

Add ability to output to GAMBIT neutral file format

See merge request !25
parents 1f1bd5fd a2072919
Pipeline #351 passed with stage
in 10 minutes 23 seconds
......@@ -148,7 +148,7 @@ set(GMSH_API
contrib/DiscreteIntegration/Integration3D.h
contrib/HighOrderMeshOptimizer/OptHOM.h contrib/HighOrderMeshOptimizer/OptHomMesh.h
contrib/HighOrderMeshOptimizer/OptHomRun.h contrib/HighOrderMeshOptimizer/ParamCoord.h
contrib/HighOrderMeshOptimizer/OptHomFastCurving.h
contrib/HighOrderMeshOptimizer/OptHomFastCurving.h
contrib/HighOrderMeshOptimizer/OptHomIntegralBoundaryDist.h
contrib/HighOrderMeshOptimizer/CADDistances.h
contrib/HighOrderMeshOptimizer/OptHomObjContribScaledJac.h
......@@ -1054,7 +1054,7 @@ if(HAVE_SOLVER)
message(STATUS "Warning: Disabling Taucs (requires METIS)")
endif(HAVE_METIS)
endif(ENABLE_TAUCS AND HAVE_BLAS AND HAVE_LAPACK)
if(ENABLE_MUMPS AND HAVE_BLAS AND HAVE_LAPACK)
set(MUMPS_LIBS_REQUIRED smumps dmumps cmumps zmumps mumps_common pord)
if(NOT ENABLE_MPI)
......@@ -1154,7 +1154,7 @@ if(ENABLE_OCC)
unset(OCC_LIB CACHE)
endforeach(OCC)
list(LENGTH OCC_LIBS NUM_OCC_LIBS)
endif(OCC_LIBS)
endif(OCC_LIBS)
if(NUM_OCC_LIBS EQUAL NUM_OCC_LIBS_REQUIRED)
set_config_option(HAVE_OCC "OpenCASCADE")
list(APPEND EXTERNAL_LIBRARIES ${OCC_LIBS})
......
......@@ -74,7 +74,7 @@ std::vector<std::pair<std::string, std::string> > GetUsage()
s.push_back(mp("-o file", "Specify output file name"));
s.push_back(mp("-format string", "Select output mesh format (auto (default), msh, "
"msh1, msh2, unv, vrml, ply2, stl, mesh, bdf, cgns, "
"p3d, diff, med, ...)"));
"p3d, diff, med, neu, ...)"));
s.push_back(mp("-bin", "Use binary format when available"));
s.push_back(mp("-refine", "Perform uniform mesh refinement, then exit"));
s.push_back(mp("-reclassify", "Reclassify mesh, then exit"));
......@@ -106,7 +106,7 @@ std::vector<std::pair<std::string, std::string> > GetUsage()
s.push_back(mp("-rand float", "Set random perturbation factor"));
s.push_back(mp("-bgm file", "Load background mesh from file"));
s.push_back(mp("-check", "Perform various consistency checks on mesh"));
s.push_back(mp("-ignorePartBound", "Ignore partition boundaries"));
s.push_back(mp("-ignorePartBound", "Ignore partition boundaries"));
s.push_back(mp("-ignorePeriocity", "Ignore periodic boundaries"));
s.push_back(mp("-oneFilePerPart", "Save mesh partitions in separate files"));
#if defined(HAVE_FLTK)
......@@ -1163,5 +1163,3 @@ void GetOptions(int argc, char *argv[])
if(CTX::instance()->terminal == 99)
CTX::instance()->terminal = terminal;
}
......@@ -79,6 +79,7 @@ int GetFileFormatFromExtension(const std::string &ext)
else if(ext == ".stp") return FORMAT_STEP;
else if(ext == ".iges") return FORMAT_IGES;
else if(ext == ".igs") return FORMAT_IGES;
else if(ext == ".neu") return FORMAT_NEU;
else return -1;
}
......@@ -133,6 +134,7 @@ std::string GetDefaultFileName(int format)
case FORMAT_BREP: name += ".brep"; break;
case FORMAT_IGES: name += ".iges"; break;
case FORMAT_STEP: name += ".step"; break;
case FORMAT_NEU: name += ".neu"; break;
default: break;
}
return name;
......@@ -396,6 +398,11 @@ void CreateOutputFile(const std::string &fileName, int format,
GModel::current()->writeOCCSTEP(name);
break;
case FORMAT_NEU:
GModel::current()->writeNEU
(name, CTX::instance()->mesh.saveAll, CTX::instance()->mesh.scalingFactor);
break;
#if defined(HAVE_FLTK)
case FORMAT_PPM:
case FORMAT_YUV:
......
......@@ -7,54 +7,55 @@
#define _GMSH_DEFINES_H_
// IO file formats (numbers should not be changed)
#define FORMAT_MSH 1
#define FORMAT_UNV 2
#define FORMAT_GREF 3
#define FORMAT_XPM 4
#define FORMAT_PS 5
#define FORMAT_BMP 6
#define FORMAT_GIF 7
#define FORMAT_GEO 8
#define FORMAT_JPEG 9
#define FORMAT_AUTO 10
#define FORMAT_PPM 11
#define FORMAT_YUV 12
#define FORMAT_DMG 13
#define FORMAT_SMS 14
#define FORMAT_OPT 15
#define FORMAT_VTK 16
#define FORMAT_MPEG 17
#define FORMAT_TEX 18
#define FORMAT_VRML 19
#define FORMAT_EPS 20
#define FORMAT_MAIL 21
#define FORMAT_PNG 22
#define FORMAT_TXT 23
#define FORMAT_PDF 24
#define FORMAT_RMED 25
#define FORMAT_POS 26
#define FORMAT_STL 27
#define FORMAT_P3D 28
#define FORMAT_SVG 29
#define FORMAT_MESH 30
#define FORMAT_BDF 31
#define FORMAT_CGNS 32
#define FORMAT_MED 33
#define FORMAT_DIFF 34
#define FORMAT_BREP 35
#define FORMAT_STEP 36
#define FORMAT_IGES 37
#define FORMAT_IR3 38
#define FORMAT_INP 39
#define FORMAT_PLY2 40
#define FORMAT_CELUM 41
#define FORMAT_SU2 42
#define FORMAT_MSH 1
#define FORMAT_UNV 2
#define FORMAT_GREF 3
#define FORMAT_XPM 4
#define FORMAT_PS 5
#define FORMAT_BMP 6
#define FORMAT_GIF 7
#define FORMAT_GEO 8
#define FORMAT_JPEG 9
#define FORMAT_AUTO 10
#define FORMAT_PPM 11
#define FORMAT_YUV 12
#define FORMAT_DMG 13
#define FORMAT_SMS 14
#define FORMAT_OPT 15
#define FORMAT_VTK 16
#define FORMAT_MPEG 17
#define FORMAT_TEX 18
#define FORMAT_VRML 19
#define FORMAT_EPS 20
#define FORMAT_MAIL 21
#define FORMAT_PNG 22
#define FORMAT_TXT 23
#define FORMAT_PDF 24
#define FORMAT_RMED 25
#define FORMAT_POS 26
#define FORMAT_STL 27
#define FORMAT_P3D 28
#define FORMAT_SVG 29
#define FORMAT_MESH 30
#define FORMAT_BDF 31
#define FORMAT_CGNS 32
#define FORMAT_MED 33
#define FORMAT_DIFF 34
#define FORMAT_BREP 35
#define FORMAT_STEP 36
#define FORMAT_IGES 37
#define FORMAT_IR3 38
#define FORMAT_INP 39
#define FORMAT_PLY2 40
#define FORMAT_CELUM 41
#define FORMAT_SU2 42
#define FORMAT_MPEG_PREVIEW 43
#define FORMAT_PGF 44
#define FORMAT_PVTU 45
#define FORMAT_X3D 46
#define FORMAT_TOCHNOG 47
#define FORMAT_TIKZ 48
#define FORMAT_PGF 44
#define FORMAT_PVTU 45
#define FORMAT_X3D 46
#define FORMAT_TOCHNOG 47
#define FORMAT_TIKZ 48
#define FORMAT_NEU 49
// Element types
#define TYPE_PNT 1
......
......@@ -316,6 +316,8 @@ static int _save_vrml(const char *name){ return genericMeshFileDialog
(name, "VRML Options", FORMAT_VRML, false, false); }
static int _save_ply2(const char *name){ return genericMeshFileDialog
(name, "PLY2 Options", FORMAT_PLY2, false, false); }
static int _save_neu(const char *name){ return genericMeshFileDialog
(name, "NEU Options", FORMAT_NEU, false, false); }
static int _save_eps(const char *name){ return gl2psFileDialog
(name, "EPS Options", FORMAT_EPS); }
static int _save_gif(const char *name){ return gifFileDialog(name); }
......@@ -380,6 +382,7 @@ static int _save_auto(const char *name)
case FORMAT_STL : return _save_stl(name);
case FORMAT_VRML : return _save_vrml(name);
case FORMAT_PLY2 : return _save_ply2(name);
case FORMAT_NEU : return _save_neu(name);
case FORMAT_EPS : return _save_eps(name);
case FORMAT_GIF : return _save_gif(name);
case FORMAT_JPEG : return _save_jpeg(name);
......@@ -436,6 +439,7 @@ static void file_export_cb(Fl_Widget *w, void *data)
{"Mesh - Tochnog" TT "*.dat", _save_tochnog},
{"Mesh - PLY2 Surface" TT "*.ply2", _save_ply2},
{"Mesh - SU2" TT "*.su2", _save_su2},
{"Mesh - GAMBIT Neutral File" TT "*.neu", _save_neu},
{"Post-processing - Gmsh POS" TT "*.pos", _save_view_pos},
{"Post-processing - X3D (X3D)" TT "*.x3d", _save_view_x3d},
#if defined(HAVE_MED)
......
......@@ -15,7 +15,7 @@ set(SRC
gmshSurface.cpp
OCCVertex.cpp OCCEdge.cpp OCCFace.cpp OCCRegion.cpp
GenericVertex.cpp GenericEdge.cpp GenericFace.cpp GenericRegion.cpp
discreteEdge.cpp discreteFace.cpp discreteDiskFace.cpp discreteRegion.cpp
discreteEdge.cpp discreteFace.cpp discreteDiskFace.cpp discreteRegion.cpp
fourierEdge.cpp fourierFace.cpp fourierProjectionFace.cpp
ACISVertex.cpp
ACISEdge.cpp
......@@ -25,12 +25,12 @@ set(SRC
GModelVertexArrays.cpp
GModelFactory.cpp
GModelIO_GEO.cpp GModelIO_ACIS.cpp GModelIO_OCC.cpp GModelIO_TOCHNOG.cpp
GModelIO_Fourier.cpp
GModelIO_MSH.cpp GModelIO_MSH2.cpp GModelIO_VTK.cpp GModelIO_POS.cpp
GModelIO_CGNS.cpp GModelIO_MED.cpp GModelIO_MESH.cpp GModelIO_STL.cpp
GModelIO_PLY.cpp GModelIO_VRML.cpp GModelIO_UNV.cpp GModelIO_BDF.cpp
GModelIO_Fourier.cpp
GModelIO_MSH.cpp GModelIO_MSH2.cpp GModelIO_VTK.cpp GModelIO_POS.cpp
GModelIO_CGNS.cpp GModelIO_MED.cpp GModelIO_MESH.cpp GModelIO_STL.cpp
GModelIO_PLY.cpp GModelIO_VRML.cpp GModelIO_UNV.cpp GModelIO_BDF.cpp
GModelIO_IR3.cpp GModelIO_DIFF.cpp GModelIO_GEOM.cpp GModelIO_INP.cpp
GModelIO_MAIL.cpp GModelIO_P3D.cpp GModelIO_CELUM.cpp
GModelIO_MAIL.cpp GModelIO_P3D.cpp GModelIO_CELUM.cpp GModelIO_NEU.cpp
GModelIO_ACTRAN.cpp GModelIO_SU2.cpp GModelIO_SAMCEF.cpp
ExtrudeParams.cpp
Geo.cpp
......@@ -51,5 +51,5 @@ set(SRC
MVertexBoundaryLayerData.cpp
)
file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h)
file(GLOB HDR RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.h)
append_gmsh_src(Geo "${SRC};${HDR}")
......@@ -724,6 +724,9 @@ class GModel {
// SU2 mesh file
int writeSU2(const std::string &name, bool saveAll, double scalingFactor);
// GAMBIT neutral mesh file (.neu)
int writeNEU(const std::string &name, bool saveAll, double scalingFactor);
};
#endif
......@@ -1338,6 +1338,19 @@ void MElement::writeMESH(FILE *fp, int elementTagType, int elementary,
if(physical < 0) reverse();
}
void MElement::writeNEU(FILE *fp, unsigned gambitType, int idAdjust, int phys)
{
if(phys < 0) reverse();
fprintf(fp, "%8d %2d %2d ", _num-idAdjust, gambitType, getNumVertices());
for(int i = 0; i < getNumVertices(); ++i) {
fprintf(fp, "%8d", getVertex(i)->getIndex());
}
fprintf(fp, "\n");
if(phys < 0) reverse();
}
void MElement::writeIR3(FILE *fp, int elementTagType, int num, int elementary,
int physical)
{
......
......@@ -385,6 +385,7 @@ class MElement
virtual void writeTOCHNOG(FILE *fp, int num);
virtual void writeMESH(FILE *fp, int elementTagType=1, int elementary=1,
int physical=0);
virtual void writeNEU(FILE *fp, unsigned gambitType, int adjust, int phys=0);
virtual void writeIR3(FILE *fp, int elementTagType, int num, int elementary,
int physical);
virtual void writeBDF(FILE *fp, int format=0, int elementTagType=1,
......
......@@ -270,6 +270,26 @@ void MVertex::writeMESH(FILE *fp, double scalingFactor)
_ge ? _ge->tag() : 0);
}
void MVertex::writeNEU(FILE *fp, int dim, double scalingFactor)
{
if(_index < 0) return; // negative index vertices are never saved
switch(dim) {
case 3:
fprintf(fp, "%10d%20.11e%20.11e%20.11e\n",
_index, x() * scalingFactor, y() * scalingFactor,
z() * scalingFactor);
break;
case 2:
fprintf(fp, "%10d%20.11e%20.11e\n",
_index, x() * scalingFactor, y() * scalingFactor);
break;
case 1:
fprintf(fp, "%10d%20.11e\n", _index, x() * scalingFactor);
break;
}
}
static void double_to_char8(double val, char *str)
{
if(val >= 1.e6)
......
......@@ -100,6 +100,7 @@ class MVertex{
bool bigEndian=false);
void writeTOCHNOG(FILE *fp, int dim, double scalingFactor=1.0);
void writeMESH(FILE *fp, double scalingFactor=1.0);
void writeNEU(FILE *fp, int dim, double scalingFactor=1.0);
void writeBDF(FILE *fp, int format=0, double scalingFactor=1.0);
void writeINP(FILE *fp, double scalingFactor=1.0);
void writeDIFF(FILE *fp, bool binary, double scalingFactor=1.0);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment