6#ifndef DUNE_GMSHREADER_HH
7#define DUNE_GMSHREADER_HH
21#include <dune/common/exceptions.hh>
22#include <dune/common/fvector.hh>
24#include <dune/geometry/type.hh>
51 template<
int dimension,
int dimWorld = dimension >
52 class GmshReaderQuadraticBoundarySegment
56 static void registerFactory() {}
71 template<
int dimWorld >
72 struct GmshReaderQuadraticBoundarySegment< 2, dimWorld >
75 typedef GmshReaderQuadraticBoundarySegment< 2, dimWorld > ThisType;
77 typedef Dune::FieldVector< double, dimWorld >
GlobalVector;
79 GmshReaderQuadraticBoundarySegment (
const GlobalVector &p0_,
const GlobalVector &p1_,
const GlobalVector &p2_)
80 : p0(p0_), p1(p1_), p2(p2_)
85 GmshReaderQuadraticBoundarySegment( ObjectStreamType& in )
88 const int bytes =
sizeof(double)*dimWorld;
89 in.read( (
char *) &p0[ 0 ], bytes );
90 in.read( (
char *) &p1[ 0 ], bytes );
91 in.read( (
char *) &p2[ 0 ], bytes );
95 static void registerFactory()
103 virtual GlobalVector operator() (
const Dune::FieldVector<double,1> &local )
const
107 y.axpy((local[0]-alpha)*(local[0]-1.0)/alpha,p0);
108 y.axpy(local[0]*(local[0]-1.0)/(alpha*(alpha-1.0)),p1);
109 y.axpy(local[0]*(local[0]-alpha)/(1.0-alpha),p2);
113 void backup( ObjectStreamType& out )
const
116 out.write( (
const char *) &key(),
sizeof(
int ) );
118 const int bytes =
sizeof(double)*dimWorld;
119 out.write( (
const char*) &p0[ 0 ], bytes );
120 out.write( (
const char*) &p1[ 0 ], bytes );
121 out.write( (
const char*) &p2[ 0 ], bytes );
132 alpha=d1.two_norm()/(d1.two_norm()+d2.two_norm());
133 if (alpha<1E-6 || alpha>1-1E-6)
134 DUNE_THROW(Dune::IOError,
"ration in quadratic boundary segment bad");
172 class GmshReaderQuadraticBoundarySegment< 3, 3 >
175 typedef GmshReaderQuadraticBoundarySegment< 3, 3 > ThisType;
178 GmshReaderQuadraticBoundarySegment (Dune::FieldVector<double,3> p0_, Dune::FieldVector<double,3> p1_,
179 Dune::FieldVector<double,3> p2_, Dune::FieldVector<double,3> p3_,
180 Dune::FieldVector<double,3> p4_, Dune::FieldVector<double,3> p5_)
181 : p0(p0_), p1(p1_), p2(p2_), p3(p3_), p4(p4_), p5(p5_)
186 GmshReaderQuadraticBoundarySegment( ObjectStreamType& in )
188 const int bytes =
sizeof(double)*3;
189 in.read( (
char *) &p0[ 0 ], bytes );
190 in.read( (
char *) &p1[ 0 ], bytes );
191 in.read( (
char *) &p2[ 0 ], bytes );
192 in.read( (
char *) &p3[ 0 ], bytes );
193 in.read( (
char *) &p4[ 0 ], bytes );
194 in.read( (
char *) &p5[ 0 ], bytes );
198 static void registerFactory()
206 virtual Dune::FieldVector<double,3> operator() (
const Dune::FieldVector<double,2>& local)
const
208 Dune::FieldVector<double,3> y;
210 y.axpy(phi0(local),p0);
211 y.axpy(phi1(local),p1);
212 y.axpy(phi2(local),p2);
213 y.axpy(phi3(local),p3);
214 y.axpy(phi4(local),p4);
215 y.axpy(phi5(local),p5);
219 void backup( ObjectStreamType& out )
const
222 out.write( (
const char*) &key(),
sizeof(
int ) );
224 const int bytes =
sizeof(double)*3;
225 out.write( (
const char*) &p0[ 0 ], bytes );
226 out.write( (
const char*) &p1[ 0 ], bytes );
227 out.write( (
const char*) &p2[ 0 ], bytes );
228 out.write( (
const char*) &p3[ 0 ], bytes );
229 out.write( (
const char*) &p4[ 0 ], bytes );
230 out.write( (
const char*) &p5[ 0 ], bytes );
238 Dune::FieldVector<double,3> d1,d2;
242 alpha=d1.two_norm()/(d1.two_norm()+d2.two_norm());
243 if (alpha<1E-6 || alpha>1-1E-6)
244 DUNE_THROW(Dune::IOError,
"alpha in quadratic boundary segment bad");
248 beta=d1.two_norm()/(d1.two_norm()+d2.two_norm());
249 if (beta<1E-6 || beta>1-1E-6)
250 DUNE_THROW(Dune::IOError,
"beta in quadratic boundary segment bad");
254 gamma=sqrt2*(d1.two_norm()/(d1.two_norm()+d2.two_norm()));
255 if (gamma<1E-6 || gamma>1-1E-6)
256 DUNE_THROW(Dune::IOError,
"gamma in quadratic boundary segment bad");
268 double phi0 (
const Dune::FieldVector<double,2>& local)
const
270 return (alpha*beta-beta*local[0]-alpha*local[1])*(1-local[0]-local[1])/(alpha*beta);
272 double phi3 (
const Dune::FieldVector<double,2>& local)
const
274 return local[0]*(1-local[0]-local[1])/(alpha*(1-alpha));
276 double phi1 (
const Dune::FieldVector<double,2>& local)
const
278 return local[0]*(gamma*local[0]-(sqrt2-gamma-sqrt2*alpha)*local[1]-alpha*gamma)/(gamma*(1-alpha));
280 double phi5 (
const Dune::FieldVector<double,2>& local)
const
282 return local[1]*(1-local[0]-local[1])/(beta*(1-beta));
284 double phi4 (
const Dune::FieldVector<double,2>& local)
const
286 return local[0]*local[1]/((1-gamma/sqrt2)*gamma/sqrt2);
288 double phi2 (
const Dune::FieldVector<double,2>& local)
const
290 return local[1]*(beta*(1-gamma/sqrt2)-local[0]*(beta-gamma/sqrt2)-local[1]*(1-gamma/sqrt2))/((1-gamma/sqrt2)*(beta-1));
293 Dune::FieldVector<double,3> p0,p1,p2,p3,p4,p5;
294 double alpha,beta,gamma,sqrt2;
300 template<
typename Gr
idType>
320 static const int dim = GridType::dimension;
321 static const int dimWorld = GridType::dimensionworld;
322 static_assert( (
dimWorld <= 3),
"GmshReader requires dimWorld <= 3." );
331 void readfile(FILE * file,
int cnt,
const char * format, ...)
333 __attribute__((format(scanf, 4, 5)))
337 va_start(ap, format);
338 off_t pos = ftello(file);
339 int c = std::vfscanf(file, format, ap);
342 DUNE_THROW(Dune::IOError,
"Error parsing " <<
fileName <<
" "
344 <<
": Expected '" << format <<
"', only read " << c <<
" entries instead of " << cnt <<
".");
352 c = std::fgetc(file);
353 }
while(c !=
'\n' && c != EOF);
378 void read (
const std::string& f)
380 if (
verbose) std::cout <<
"Reading " <<
dim <<
"d Gmsh grid..." << std::endl;
384 FILE* file = fopen(
fileName.c_str(),
"rb");
386 DUNE_THROW(Dune::IOError,
"Could not open " <<
fileName);
398 double version_number;
399 int file_type, data_size;
402 if (strcmp(
buf,
"$MeshFormat")!=0)
403 DUNE_THROW(Dune::IOError,
"expected $MeshFormat in first line");
404 readfile(file,3,
"%lg %d %d\n",&version_number,&file_type,&data_size);
407 if( (version_number < 2.0) || (version_number >= 2.20001) )
408 DUNE_THROW(Dune::IOError,
"can only read Gmsh version 2 files");
409 if (
verbose) std::cout <<
"version " << version_number <<
" Gmsh file detected" << std::endl;
411 if (strcmp(
buf,
"$EndMeshFormat")!=0)
412 DUNE_THROW(Dune::IOError,
"expected $EndMeshFormat");
417 if (strcmp(
buf,
"$PhysicalNames")==0) {
419 readfile(file,1,
"%d\n",&number_of_names);
420 if (
verbose) std::cout <<
"file contains " << number_of_names <<
" physical entities" << std::endl;
422 std::string buf_name;
423 for(
int i = 0; i < number_of_names; ++i ) {
426 buf_name.assign(
buf);
427 auto begin = buf_name.find_first_of(
'\"') + 1;
428 auto end = buf_name.find_last_of(
'\"') - begin;
432 if (strcmp(
buf,
"$EndPhysicalNames")!=0)
433 DUNE_THROW(Dune::IOError,
"expected $EndPhysicalNames");
440 if (strcmp(
buf,
"$Nodes")!=0)
441 DUNE_THROW(Dune::IOError,
"expected $Nodes");
442 readfile(file,1,
"%d\n",&number_of_nodes);
443 if (
verbose) std::cout <<
"file contains " << number_of_nodes <<
" nodes" << std::endl;
447 std::vector< GlobalVector > nodes( number_of_nodes+1 );
451 for(
int i = 1; i <= number_of_nodes; ++i )
453 readfile(file,4,
"%d %lg %lg %lg\n", &
id, &x[ 0 ], &x[ 1 ], &x[ 2 ] );
455 if (
id > number_of_nodes) {
456 DUNE_THROW(Dune::IOError,
457 "Only dense sequences of node indices are currently supported (node index "
458 <<
id <<
" is invalid).");
463 nodes[
id ][ j ] = x[ j ];
466 if (strcmp(
buf,
"$EndNodes")!=0)
467 DUNE_THROW(Dune::IOError,
"expected $EndNodes");
472 if (strcmp(
buf,
"$Elements")!=0)
473 DUNE_THROW(Dune::IOError,
"expected $Elements");
474 int number_of_elements;
475 readfile(file,1,
"%d\n",&number_of_elements);
476 if (
verbose) std::cout <<
"file contains " << number_of_elements <<
" elements" << std::endl;
483 off_t section_element_offset = ftello(file);
484 std::map<int,unsigned int> renumber;
485 for (
int i=1; i<=number_of_elements; i++)
487 int id, elm_type, number_of_tags;
488 readfile(file,3,
"%d %d %d ",&
id,&elm_type,&number_of_tags);
489 for (
int k=1; k<=number_of_tags; k++)
507 if (strcmp(
buf,
"$EndElements")!=0)
508 DUNE_THROW(Dune::IOError,
"expected $EndElements");
516 fseeko(file, section_element_offset, SEEK_SET);
519 for (
int i=1; i<=number_of_elements; i++)
521 int id, elm_type, number_of_tags;
522 readfile(file,3,
"%d %d %d ",&
id,&elm_type,&number_of_tags);
523 int physical_entity = -1;
525 for (
int k=1; k<=number_of_tags; k++)
529 if (k==1) physical_entity = blub;
534 if (strcmp(
buf,
"$EndElements")!=0)
535 DUNE_THROW(Dune::IOError,
"expected $EndElements");
546 std::map<int,unsigned int> & renumber,
547 const std::vector< GlobalVector > & nodes)
550 const int nDofs[16] = {-1, 2, 3, 4, 4, 8, 6, 5, 3, 6, -1, 10, -1, -1, -1, 1};
551 const int nVertices[16] = {-1, 2, 3, 4, 4, 8, 6, 5, 2, 3, -1, 4, -1, -1, -1, 1};
552 const int elementDim[16] = {-1, 1, 2, 2, 3, 3, 3, 3, 1, 2, -1, 3, -1, -1, -1, 0};
555 if ( not (elm_type > 0 && elm_type <= 15
556 && (elementDim[elm_type] ==
dim || elementDim[elm_type] == (
dim-1) ) ) )
563 std::string formatString =
"%d";
564 for (
int i=1; i<nDofs[elm_type]; i++)
565 formatString +=
" %d";
566 formatString +=
"\n";
569 std::vector<int> elementDofs(10);
571 readfile(file,nDofs[elm_type], formatString.c_str(),
572 &(elementDofs[0]),&(elementDofs[1]),&(elementDofs[2]),
573 &(elementDofs[3]),&(elementDofs[4]),&(elementDofs[5]),
574 &(elementDofs[6]),&(elementDofs[7]),&(elementDofs[8]),
578 for (
int i=0; i<nVertices[elm_type]; i++)
579 if (renumber.find(elementDofs[i])==renumber.end())
582 factory.insertVertex(nodes[elementDofs[i]]);
586 if (elementDim[elm_type] ==
dim)
596 template <
class E,
class V,
class V2>
603 DUNE_THROW(Dune::IOError,
"tried to create a 3D boundary segment in a non-3D Grid");
607 template <
class E,
class V>
609 const std::vector<FieldVector<double, 3> >& nodes,
610 const E& elementDofs,
614 std::array<FieldVector<double,dimWorld>, 6> v;
615 for (
int i=0; i<6; i++)
617 v[i][j] = nodes[elementDofs[i]][j];
623 factory.insertBoundarySegment( vertices,
634 std::map<int,unsigned int> & renumber,
635 const std::vector< GlobalVector > & nodes,
636 const int physical_entity)
639 const int nDofs[16] = {-1, 2, 3, 4, 4, 8, 6, 5, 3, 6, -1, 10, -1, -1, -1, 1};
640 const int nVertices[16] = {-1, 2, 3, 4, 4, 8, 6, 5, 2, 3, -1, 4, -1, -1, -1, 1};
641 const int elementDim[16] = {-1, 1, 2, 2, 3, 3, 3, 3, 1, 2, -1, 3, -1, -1, -1, 0};
644 if ( not (elm_type > 0 && elm_type <= 15
645 && (elementDim[elm_type] ==
dim || elementDim[elm_type] == (
dim-1) ) ) )
652 std::string formatString =
"%d";
653 for (
int i=1; i<nDofs[elm_type]; i++)
654 formatString +=
" %d";
655 formatString +=
"\n";
658 std::vector<int> elementDofs(10);
660 readfile(file,nDofs[elm_type], formatString.c_str(),
661 &(elementDofs[0]),&(elementDofs[1]),&(elementDofs[2]),
662 &(elementDofs[3]),&(elementDofs[4]),&(elementDofs[5]),
663 &(elementDofs[6]),&(elementDofs[7]),&(elementDofs[8]),
670 std::swap(elementDofs[2],elementDofs[3]);
673 std::swap(elementDofs[2],elementDofs[3]);
674 std::swap(elementDofs[6],elementDofs[7]);
677 std::swap(elementDofs[2],elementDofs[3]);
683 std::vector<unsigned int> vertices(nVertices[elm_type]);
685 for (
int i=0; i<nVertices[elm_type]; i++)
686 vertices[i] = renumber[elementDofs[i]];
689 if (elementDim[elm_type] ==
dim) {
694 factory.insertElement(Dune::GeometryTypes::line,vertices);
697 factory.insertElement(Dune::GeometryTypes::triangle,vertices);
700 factory.insertElement(Dune::GeometryTypes::quadrilateral,vertices);
703 factory.insertElement(Dune::GeometryTypes::tetrahedron,vertices);
706 factory.insertElement(Dune::GeometryTypes::hexahedron,vertices);
709 factory.insertElement(Dune::GeometryTypes::prism,vertices);
712 factory.insertElement(Dune::GeometryTypes::pyramid,vertices);
715 factory.insertElement(Dune::GeometryTypes::triangle,vertices);
718 factory.insertElement(Dune::GeometryTypes::tetrahedron,vertices);
729 factory.insertBoundarySegment(vertices);
733 factory.insertBoundarySegment(vertices);
737 factory.insertBoundarySegment(vertices);
741 factory.insertBoundarySegment(vertices);
745 std::array<FieldVector<double,dimWorld>, 3> v;
747 v[0][i] = nodes[elementDofs[0]][i];
748 v[1][i] = nodes[elementDofs[2]][i];
749 v[2][i] = nodes[elementDofs[1]][i];
753 factory.insertBoundarySegment(vertices,
762 DUNE_THROW(Dune::IOError,
"GmshReader does not support using element-type " << elm_type <<
" for boundary segments");
772 if (elementDim[elm_type] ==
dim) {
802 static_cast<int>(a) |
static_cast<int>(b)
809 return static_cast<int>(a) &
static_cast<int>(b);
838 template<
typename Gr
idType>
862 const std::string &fileName,
863 std::vector<int>& boundarySegmentToPhysicalEntity,
864 std::vector<int>& elementToPhysicalEntity,
865 bool verbose,
bool insertBoundarySegments)
869 GmshReaderQuadraticBoundarySegment< Grid::dimension, Grid::dimensionworld >::registerFactory();
873 factory.
comm().barrier();
877 if (factory.
comm().rank() == 0)
880 parser.
read(fileName);
882 boundarySegmentToPhysicalEntity = std::move(parser.
boundaryIdMap());
887 boundarySegmentToPhysicalEntity = {};
888 elementToPhysicalEntity = {};
913 static T &discarded(T &&value) {
return static_cast<T&
>(value); }
916 std::vector<int> *data_ =
nullptr;
917 DataArg(std::vector<int> &data) : data_(&data) {}
918 DataArg(
const decltype(std::ignore)&) {}
922 struct DataFlagArg : DataArg {
924 using DataArg::DataArg;
925 DataFlagArg(
bool flag) : flag_(flag) {}
937 static std::unique_ptr<Grid>
read (
const std::string& fileName,
bool verbose =
true,
bool insertBoundarySegments=
true)
942 read(factory, fileName, verbose, insertBoundarySegments);
966 static std::unique_ptr<Grid>
read (
const std::string& fileName,
967 std::vector<int>& boundarySegmentToPhysicalEntity,
968 std::vector<int>& elementToPhysicalEntity,
969 bool verbose =
true,
bool insertBoundarySegments=
true)
975 factory, fileName, boundarySegmentToPhysicalEntity,
976 elementToPhysicalEntity, verbose, insertBoundarySegments
984 bool verbose =
true,
bool insertBoundarySegments=
true)
987 factory, fileName, discarded(std::vector<int>{}),
988 discarded(std::vector<int>{}), verbose, insertBoundarySegments
1017 const std::string &fileName,
1018 DataFlagArg boundarySegmentData,
1024 boundarySegmentData.data_
1025 ? *boundarySegmentData.data_ : discarded(std::vector<int>{}),
1027 ? *
elementData.data_ : discarded(std::vector<int>{}),
1029 boundarySegmentData.flag_ || boundarySegmentData.data_
1054 const std::string& fileName,
1055 std::vector<int>& boundarySegmentToPhysicalEntity,
1056 std::vector<int>& elementToPhysicalEntity,
1057 bool verbose,
bool insertBoundarySegments)
1060 factory, fileName, boundarySegmentToPhysicalEntity,
1061 elementToPhysicalEntity, verbose, insertBoundarySegments
1071 Opts::verbose | Opts::insertBoundarySegments | Opts::readElementData | Opts::readBoundaryData;
1100 gridFactory_ = std::make_unique<Dune::GridFactory<Grid>>();
1101 readGridFile(fileName, *gridFactory_, options);
1114 readGridFile(fileName, factory, options);
1121 return elementIndexToGmshPhysicalEntity_;
1127 checkBoundaryData();
1128 return boundarySegmentIndexToGmshPhysicalEntity_;
1136 {
return hasElementData_ && !extractedElementData_; }
1143 {
return hasBoundaryData_ && !extractedBoundaryData_; }
1149 extractedElementData_ =
true;
1150 return std::move(elementIndexToGmshPhysicalEntity_);
1156 checkBoundaryData();
1157 extractedBoundaryData_ =
true;
1158 return std::move(boundarySegmentIndexToGmshPhysicalEntity_);
1165 DUNE_THROW(Dune::InvalidStateException,
1166 "This GmshReader has been constructed with a Dune::GridFactory. "
1167 <<
"This grid factory has been filled with all information to create a grid. "
1168 <<
"Please use this factory to create the grid by calling factory.createGrid(). "
1169 <<
"Alternatively use the constructor without passing the factory in combination with this member function."
1172 return gridFactory_->createGrid();
1178 void checkElementData ()
const
1180 if (!hasElementData_)
1181 DUNE_THROW(Dune::InvalidStateException,
1182 "This GmshReader has been constructed without the option 'readElementData'. "
1183 <<
"Please enable reading element data by passing the option 'Gmsh::ReaderOpts::readElementData' "
1184 <<
"to the constructor of this class."
1187 if (extractedElementData_)
1188 DUNE_THROW(Dune::InvalidStateException,
1189 "The element data has already been extracted from this GmshReader "
1190 <<
"via a function call to reader.extractElementData(). Use the extracted data or "
1191 <<
"read the grid data from file again by constructing a new reader."
1195 void checkBoundaryData ()
const
1197 if (!hasBoundaryData_)
1198 DUNE_THROW(Dune::InvalidStateException,
1199 "This GmshReader has been constructed without the option 'readBoundaryData'. "
1200 <<
"Please enable reading boundary data by passing the option 'Gmsh::ReaderOpts::readBoundaryData' "
1201 <<
"to the constructor of this class."
1204 if (extractedBoundaryData_)
1205 DUNE_THROW(Dune::InvalidStateException,
1206 "The boundary data has already been extracted from this GmshReader "
1207 <<
"via a function call to reader.extractBoundaryData(). Use the extracted data or "
1208 <<
"read the grid data from file again by constructing a new reader."
1212 void readGridFile (
const std::string& fileName, GridFactory<Grid>& factory,
Gmsh::ReaderOptions options)
1214 const bool verbose = options & Opts::verbose;
1220 factory, fileName, boundarySegmentIndexToGmshPhysicalEntity_,
1221 elementIndexToGmshPhysicalEntity_, verbose,
1222 readBoundaryData || insertBoundarySegments
1226 if (!readBoundaryData)
1227 boundarySegmentIndexToGmshPhysicalEntity_ = std::vector<int>{};
1228 if (!readElementData)
1229 elementIndexToGmshPhysicalEntity_ = std::vector<int>{};
1235 std::unique_ptr<Dune::GridFactory<Grid>> gridFactory_;
1237 std::vector<int> elementIndexToGmshPhysicalEntity_;
1238 std::vector<int> boundarySegmentIndexToGmshPhysicalEntity_;
1240 bool hasElementData_;
1241 bool hasBoundaryData_;
1244 bool extractedElementData_ =
false;
1245 bool extractedBoundaryData_ =
false;
Base class for grid boundary segments of arbitrary geometry.
ReaderOptions
Option for the Gmsh mesh file reader.
Definition gmshreader.hh:791
void swap(Dune::PersistentContainer< G, T > &a, Dune::PersistentContainer< G, T > &b)
Definition utility/persistentcontainer.hh:83
Include standard header files.
Definition agrid.hh:60
ALBERTA REAL_D GlobalVector
Definition misc.hh:50
constexpr bool operator&(ReaderOptions a, ReaderOptions b)
query operator for reader options (is b set in a)
Definition gmshreader.hh:807
constexpr ReaderOptions operator|(ReaderOptions a, ReaderOptions b)
composition operator for reader options
Definition gmshreader.hh:799
Base class for classes implementing geometries of boundary segments.
Definition boundarysegment.hh:94
Communication comm() const
Return the Communication used by the grid factory.
Definition common/gridfactory.hh:258
Provide a generic factory class for unstructured grids.
Definition common/gridfactory.hh:275
virtual std::unique_ptr< GridType > createGrid()
Finalize grid creation and hand over the grid.
Definition common/gridfactory.hh:333
Options for read operation.
Definition gmshreader.hh:39
GeometryOrder
Definition gmshreader.hh:40
@ firstOrder
edges are straight lines.
Definition gmshreader.hh:42
@ secondOrder
quadratic boundary approximation.
Definition gmshreader.hh:44
dimension independent parts for GmshReaderParser
Definition gmshreader.hh:302
std::vector< std::string > & physicalEntityNames()
Returns the names of the gmsh physical entities (0-based index)
Definition gmshreader.hh:373
void pass1HandleElement(FILE *file, const int elm_type, std::map< int, unsigned int > &renumber, const std::vector< GlobalVector > &nodes)
Process one element during the first pass through the list of all elements.
Definition gmshreader.hh:545
static const int dimWorld
Definition gmshreader.hh:321
Dune::GridFactory< GridType > & factory
Definition gmshreader.hh:305
std::vector< int > & boundaryIdMap()
Definition gmshreader.hh:361
void readfile(FILE *file, int cnt, const char *format,...)
Definition gmshreader.hh:331
std::vector< int > & elementIndexMap()
Returns a map for the gmsh physical entity id (1-based index) for each entity of codim 0.
Definition gmshreader.hh:367
unsigned int number_of_real_vertices
Definition gmshreader.hh:308
void boundarysegment_insert(const std::vector< FieldVector< double, 3 > > &nodes, const E &elementDofs, const V &vertices)
Definition gmshreader.hh:608
GmshReaderParser(Dune::GridFactory< GridType > &_factory, bool v, bool i)
Definition gmshreader.hh:358
int element_count
Definition gmshreader.hh:310
void read(const std::string &f)
Definition gmshreader.hh:378
void skipline(FILE *file)
Definition gmshreader.hh:348
std::vector< int > element_index_to_physical_entity
Definition gmshreader.hh:316
virtual void pass2HandleElement(FILE *file, const int elm_type, std::map< int, unsigned int > &renumber, const std::vector< GlobalVector > &nodes, const int physical_entity)
Process one element during the second pass through the list of all elements.
Definition gmshreader.hh:633
static const int dim
Definition gmshreader.hh:320
FieldVector< double, dimWorld > GlobalVector
Definition gmshreader.hh:325
std::string fileName
Definition gmshreader.hh:313
std::vector< std::string > physical_entity_names
Definition gmshreader.hh:317
int boundary_element_count
Definition gmshreader.hh:309
void boundarysegment_insert(const V &, const E &, const V2 &)
Definition gmshreader.hh:597
bool verbose
Definition gmshreader.hh:306
std::vector< int > boundary_id_to_physical_entity
Definition gmshreader.hh:315
char buf[512]
Definition gmshreader.hh:312
bool insert_boundary_segments
Definition gmshreader.hh:307
Read Gmsh mesh file.
Definition gmshreader.hh:840
static std::unique_ptr< Grid > read(const std::string &fileName, std::vector< int > &boundarySegmentToPhysicalEntity, std::vector< int > &elementToPhysicalEntity, bool verbose=true, bool insertBoundarySegments=true)
Read Gmsh file, possibly with data.
Definition gmshreader.hh:966
const std::vector< int > & elementData() const
Access element data (maps element index to Gmsh physical entity)
Definition gmshreader.hh:1118
static void read(Dune::GridFactory< Grid > &factory, const std::string &fileName, DataFlagArg boundarySegmentData, DataArg elementData, bool verbose=true)
read Gmsh file, possibly with data
Definition gmshreader.hh:1016
static std::unique_ptr< Grid > read(const std::string &fileName, bool verbose=true, bool insertBoundarySegments=true)
Definition gmshreader.hh:937
static void read(Dune::GridFactory< Grid > &factory, const std::string &fileName, bool verbose=true, bool insertBoundarySegments=true)
Definition gmshreader.hh:983
GridType Grid
Definition gmshreader.hh:929
std::unique_ptr< Grid > createGrid()
Create the grid.
Definition gmshreader.hh:1162
std::vector< int > extractBoundaryData()
Erase boundary data from reader and return the data.
Definition gmshreader.hh:1154
static void read(Dune::GridFactory< Grid > &factory, const std::string &fileName, std::vector< int > &boundarySegmentToPhysicalEntity, std::vector< int > &elementToPhysicalEntity, bool verbose, bool insertBoundarySegments)
Read Gmsh file, possibly with data.
Definition gmshreader.hh:1053
bool hasElementData() const
If element data is available.
Definition gmshreader.hh:1135
bool hasBoundaryData() const
If boundary data is available.
Definition gmshreader.hh:1142
static constexpr Opts defaultOpts
Definition gmshreader.hh:1070
GmshReader(const std::string &fileName, GridFactory< Grid > &factory, Gmsh::ReaderOptions options=defaultOpts)
Construct a Gmsh reader object from a file name and a grid factory.
Definition gmshreader.hh:1111
GmshReader(const std::string &fileName, Gmsh::ReaderOptions options=defaultOpts)
Construct a Gmsh reader object (alternatively use one of the static member functions)
Definition gmshreader.hh:1097
std::vector< int > extractElementData()
Erase element data from reader and return the data.
Definition gmshreader.hh:1146
const std::vector< int > & boundaryData() const
Access boundary data (maps boundary segment index to Gmsh physical entity)
Definition gmshreader.hh:1125
Provide a generic factory class for unstructured grids.