10#include <dune/gmsh4/utility/string.hh>
12#include <dune/grid/io/file/gmshreader.hh>
16template <
class G,
class C,
class S>
17std::map<int, S> Gmsh4Reader<G,C,S>::elementType_ {
157template <
class G,
class C,
class S>
158std::map<std::string, typename Gmsh4Reader<G,C,S>::Sections> Gmsh4Reader<G,C,S>::sections_ {
159 {
"MeshFormat", Sections::MESH_FORMAT},
160 {
"PhysicalNames", Sections::PHYSICAL_NAMES},
161 {
"Entities", Sections::ENTITIES},
162 {
"PartitionedEntities", Sections::PARTITIONED_ENTITIES},
163 {
"Nodes", Sections::NODES},
164 {
"Elements", Sections::ELEMENTS},
165 {
"Periodic", Sections::PERIODIC},
166 {
"GhostElements", Sections::GHOST_ELEMENTS},
167 {
"Parametrization", Sections::PARAMETRIZATION},
168 {
"NodeData", Sections::NODE_DATA},
169 {
"ElementData", Sections::ELEMENT_DATA},
170 {
"ElementNodeData", Sections::ELEMENT_NODE_DATA},
171 {
"InterpolationScheme", Sections::INTERPOLATION_SCHEME}
174template <
class G,
class C,
class S>
175struct Gmsh4Reader<G,C,S>::PhysicalNamesAttributes
182template <
class G,
class C,
class S>
183struct Gmsh4Reader<G,C,S>::PointAttributes
186 std::array<double,3> xyz;
187 std::vector<int> physicalTags;
190template <
class G,
class C,
class S>
191struct Gmsh4Reader<G,C,S>::EntityAttributes
194 std::array<double,3> min_xyz;
195 std::array<double,3> max_xyz;
196 std::vector<int> physicalTags;
197 std::vector<int> boundingEntities;
200template <
class G,
class C,
class S>
201struct Gmsh4Reader<G,C,S>::GhostAttributes
207template <
class G,
class C,
class S>
208struct Gmsh4Reader<G,C,S>::NodeAttributes
213 std::array<double,3> xyz;
214 std::array<double,3> uvw;
220 std::vector<Node> nodes;
223template <
class G,
class C,
class S>
224struct Gmsh4Reader<G,C,S>::ElementAttributes
229 std::vector<size_type> nodes;
238template <
class G,
class C,
class S>
239struct Gmsh4Reader<G,C,S>::PeriodicAttributes
250 std::vector<double> affine;
251 std::vector<Association> correspondingNodes;
255template <
class G,
class C,
class S>
257void Gmsh4Reader<G,C,S>::readValueBinary(std::ifstream& input, T &v)
259 const std::size_t
size =
sizeof(T);
260 input.read(
reinterpret_cast<char*
>(&v),
size);
263 char* vBinary =
reinterpret_cast<char*
>(&v);
264 for (std::size_t i=0; i<
size/2; ++i)
265 std::swap(vBinary[i],vBinary[
size-1-i]);
270template <
class G,
class C,
class S>
273 const std::filesystem::path filePath(filename);
276 if (!std::filesystem::exists(filePath))
279 std::ifstream input(filename, std::ios_base::in | std::ios_base::binary);
282 const std::string ext = filePath.extension().string();
287 std::getline(input,
line);
293 double version = 0.0;
296 readMeshFormat(input, version, file_type, data_size);
301 GMSH4_ASSERT_MSG((version >= 4.0 && version < 5.0) || (version >= 2.0 && version <= 2.2),
302 "Can only read gmsh files versions >= 4.0 and < 5.0 and versions >= 2.0 and <= 2.2");
305 if (version >= 2.0 && version <= 2.2)
307 std::vector<int> boundarySegmentToPhysicalEntity, elementToPhysicalEntity;
310 boundarySegmentToPhysicalEntity,
311 elementToPhysicalEntity,
319 "Invalid file-type: 0 for ASCII mode, 1 for binary mode");
321 "Invalid data-size range: should be in {4, 16}");
323 "Invalid data-size: must be sizeof(size_t)");
327 input.seekg(0, std::ios::beg);
329 readSerialFileFromStream(input, fillCreator);
330 pieces_.push_back(filename);
331 }
else if (ext ==
".pro") {
332 readParallelFileFromStream(input, comm().rank(), comm().
size(), fillCreator);
334 DUNE_THROW(
IOError,
"File has unknown file-extension '" << ext <<
"'. Allowed are only '.msh' and '.pro'.");
339template <
class G,
class C,
class S>
348 Sections section = Sections::NO_SECTION;
349 for (std::string
line; std::getline(input,
line); ) {
353 for (
auto const& s : sections_) {
354 if (isSection(
line, s.first, section)) {
357 }
else if (isSection(
line,
"End" + s.first, section, s.second)) {
358 section = Sections::NO_SECTION;
364 case Sections::MESH_FORMAT: {
365 double version = 0.0;
366 readMeshFormat(input, version, file_type, data_size);
369 case Sections::PHYSICAL_NAMES:
370 readPhysicalNames(input);
break;
371 case Sections::ENTITIES:
372 if(file_type == 0) readEntitiesAscii(input);
373 else readEntitiesBinary(input);
375 case Sections::PARTITIONED_ENTITIES:
376 if(file_type == 0) readPartitionedEntitiesAscii(input);
377 else readPartitionedEntitiesBinary(input);
379 case Sections::NODES:
380 if(file_type == 0) readNodesAscii(input);
381 else readNodesBinary(input);
383 case Sections::ELEMENTS:
384 if(file_type == 0) readElementsAscii(input);
385 else readElementsBinary(input);
387 case Sections::PERIODIC:
388 readPeriodic(input);
break;
389 case Sections::GHOST_ELEMENTS:
390 readGhostElements(input);
break;
391 case Sections::PARAMETRIZATION:
392 readParametrization(input);
break;
393 case Sections::NODE_DATA:
394 readNodeData(input);
break;
395 case Sections::ELEMENT_DATA:
396 readElementData(input);
break;
397 case Sections::ELEMENT_NODE_DATA:
398 readElementNodeData(input);
break;
399 case Sections::INTERPOLATION_SCHEME:
400 readInterpolationScheme(input);
break;
412template <
class G,
class C,
class S>
422template <
class G,
class C,
class S>
426 std::getline(input,
line);
427 std::istringstream stream(
line);
428 stream >> version >> file_type >> data_size;
429 if (file_type != 0) {
431 input.read(
reinterpret_cast<char*
>(&one),
sizeof(
int));
432 if (one != 1) swap =
true;
433 std::getline(input,
line);
438template <
class G,
class C,
class S>
439void Gmsh4Reader<G,C,S>::readPhysicalNames (std::ifstream& input)
441 int numPhysicalNames = 0;
443 std::getline(input,
line);
445 std::istringstream stream(
line);
446 stream >> numPhysicalNames;
449 for (
int i = 0; i < numPhysicalNames; ++i) {
450 if (!std::getline(input,
line))
453 std::istringstream stream(
line);
454 PhysicalNamesAttributes attr;
455 stream >> attr.dim >> attr.tag;
456 readString(stream, attr.name);
458 physicalNames_.push_back(attr);
463template <
class G,
class C,
class S>
464void Gmsh4Reader<G,C,S>::readEntitiesAscii (std::ifstream& input)
466 size_type numPoints = 0, numCurves = 0, numSurfaces = 0, numVolumes = 0;
469 std::getline(input,
line);
471 std::istringstream stream(
line);
472 stream >> numPoints >> numCurves >> numSurfaces >> numVolumes;
476 points_.reserve(numPoints);
477 for (size_type i = 0; i < numPoints; ++i) {
478 if (!std::getline(input,
line))
481 std::istringstream stream(
line);
482 PointAttributes attr;
483 stream >> attr.tag >> attr.xyz[0] >> attr.xyz[1] >> attr.xyz[2];
485 size_type numPhysicalTags = 0;
486 stream >> numPhysicalTags;
488 attr.physicalTags.resize(numPhysicalTags);
489 for (size_type j = 0; j < numPhysicalTags; ++j)
490 stream >> attr.physicalTags[j];
492 points_.push_back(attr);
497 curves_.reserve(numCurves);
498 for (size_type i = 0; i < numCurves; ++i) {
499 if (!std::getline(input,
line))
502 std::istringstream stream(
line);
503 EntityAttributes attr;
505 >> attr.min_xyz[0] >> attr.min_xyz[1] >> attr.min_xyz[2]
506 >> attr.max_xyz[0] >> attr.max_xyz[1] >> attr.max_xyz[2];
508 size_type numPhysicalTags = 0;
509 stream >> numPhysicalTags;
510 attr.physicalTags.resize(numPhysicalTags);
511 for (size_type j = 0; j < numPhysicalTags; ++j)
512 stream >> attr.physicalTags[j];
514 size_type numBoundingPoints = 0;
515 stream >> numBoundingPoints;
516 attr.boundingEntities.resize(numBoundingPoints);
517 for (size_type j = 0; j < numBoundingPoints; ++j)
518 stream >> attr.boundingEntities[j];
520 curves_.push_back(attr);
525 surfaces_.reserve(numSurfaces);
526 for (size_type i = 0; i < numSurfaces; ++i) {
527 if (!std::getline(input,
line))
530 std::istringstream stream(
line);
531 EntityAttributes attr;
533 >> attr.min_xyz[0] >> attr.min_xyz[1] >> attr.min_xyz[2]
534 >> attr.max_xyz[0] >> attr.max_xyz[1] >> attr.max_xyz[2];
536 size_type numPhysicalTags = 0;
537 stream >> numPhysicalTags;
538 attr.physicalTags.resize(numPhysicalTags);
539 for (size_type j = 0; j < numPhysicalTags; ++j)
540 stream >> attr.physicalTags[j];
542 size_type numBoundingCurves = 0;
543 stream >> numBoundingCurves;
544 attr.boundingEntities.resize(numBoundingCurves);
545 for (size_type j = 0; j < numBoundingCurves; ++j)
546 stream >> attr.boundingEntities[j];
548 surfaces_.push_back(attr);
553 volumes_.reserve(numVolumes);
554 for (size_type i = 0; i < numVolumes; ++i) {
555 if (!std::getline(input,
line))
558 std::istringstream stream(
line);
559 EntityAttributes attr;
561 >> attr.min_xyz[0] >> attr.min_xyz[1] >> attr.min_xyz[2]
562 >> attr.max_xyz[0] >> attr.max_xyz[1] >> attr.max_xyz[2];
564 size_type numPhysicalTags = 0;
565 stream >> numPhysicalTags;
566 attr.physicalTags.resize(numPhysicalTags);
567 for (size_type j = 0; j < numPhysicalTags; ++j)
568 stream >> attr.physicalTags[j];
570 size_type numBoundingSurfaces = 0;
571 stream >> numBoundingSurfaces;
572 attr.boundingEntities.resize(numBoundingSurfaces);
573 for (size_type j = 0; j < numBoundingSurfaces; ++j)
574 stream >> attr.boundingEntities[j];
576 volumes_.push_back(attr);
582template <
class G,
class C,
class S>
583void Gmsh4Reader<G,C,S>::readEntitiesBinary (std::ifstream& input)
585 size_type numPoints = 0, numCurves = 0, numSurfaces = 0, numVolumes = 0;
587 readValueBinary(input, numPoints);
588 readValueBinary(input, numCurves);
589 readValueBinary(input, numSurfaces);
590 readValueBinary(input, numVolumes);
593 points_.reserve(numPoints);
594 for (size_type i = 0; i < numPoints; ++i) {
595 PointAttributes attr;
597 readValueBinary(input, attr.tag);
598 readValueBinary(input, attr.xyz[0]);
599 readValueBinary(input, attr.xyz[1]);
600 readValueBinary(input, attr.xyz[2]);
602 size_type numPhysicalTags = 0;
603 readValueBinary(input, numPhysicalTags);
604 attr.physicalTags.resize(numPhysicalTags);
605 for (size_type j = 0; j < numPhysicalTags; ++j)
606 readValueBinary(input, attr.physicalTags[j]);
608 points_.push_back(attr);
613 curves_.reserve(numCurves);
614 for (size_type i = 0; i < numCurves; ++i) {
615 EntityAttributes attr;
617 readValueBinary(input, attr.tag);
618 readValueBinary(input, attr.min_xyz[0]);
619 readValueBinary(input, attr.min_xyz[1]);
620 readValueBinary(input, attr.min_xyz[2]);
621 readValueBinary(input, attr.max_xyz[0]);
622 readValueBinary(input, attr.max_xyz[1]);
623 readValueBinary(input, attr.max_xyz[2]);
625 size_type numPhysicalTags = 0;
626 readValueBinary(input, numPhysicalTags);
627 attr.physicalTags.resize(numPhysicalTags);
628 for (size_type j = 0; j < numPhysicalTags; ++j)
629 readValueBinary(input, attr.physicalTags[j]);
631 size_type numBoundingPoints = 0;
632 readValueBinary(input, numBoundingPoints);
633 attr.boundingEntities.resize(numBoundingPoints);
634 for (size_type j = 0; j < numBoundingPoints; ++j)
635 readValueBinary(input, attr.boundingEntities[j]);
637 curves_.push_back(attr);
642 surfaces_.reserve(numSurfaces);
643 for (size_type i = 0; i < numSurfaces; ++i) {
644 EntityAttributes attr;
646 readValueBinary(input, attr.tag);
647 readValueBinary(input, attr.min_xyz[0]);
648 readValueBinary(input, attr.min_xyz[1]);
649 readValueBinary(input, attr.min_xyz[2]);
650 readValueBinary(input, attr.max_xyz[0]);
651 readValueBinary(input, attr.max_xyz[1]);
652 readValueBinary(input, attr.max_xyz[2]);
654 size_type numPhysicalTags = 0;
655 readValueBinary(input, numPhysicalTags);
656 attr.physicalTags.resize(numPhysicalTags);
657 for (size_type j = 0; j < numPhysicalTags; ++j)
658 readValueBinary(input, attr.physicalTags[j]);
660 size_type numBoundingCurves = 0;
661 readValueBinary(input, numBoundingCurves);
662 attr.boundingEntities.resize(numBoundingCurves);
663 for (size_type j = 0; j < numBoundingCurves; ++j)
664 readValueBinary(input, attr.boundingEntities[j]);
666 surfaces_.push_back(attr);
671 volumes_.reserve(numVolumes);
672 for (size_type i = 0; i < numVolumes; ++i) {
673 EntityAttributes attr;
675 readValueBinary(input, attr.tag);
676 readValueBinary(input, attr.min_xyz[0]);
677 readValueBinary(input, attr.min_xyz[1]);
678 readValueBinary(input, attr.min_xyz[2]);
679 readValueBinary(input, attr.max_xyz[0]);
680 readValueBinary(input, attr.max_xyz[1]);
681 readValueBinary(input, attr.max_xyz[2]);
683 size_type numPhysicalTags = 0;
684 readValueBinary(input, numPhysicalTags);
685 attr.physicalTags.resize(numPhysicalTags);
686 for (size_type j = 0; j < numPhysicalTags; ++j)
687 readValueBinary(input, attr.physicalTags[j]);
689 size_type numBoundingSurfaces = 0;
690 readValueBinary(input, numBoundingSurfaces);
691 attr.boundingEntities.resize(numBoundingSurfaces);
692 for (size_type j = 0; j < numBoundingSurfaces; ++j)
693 readValueBinary(input, attr.boundingEntities[j]);
695 volumes_.push_back(attr);
699 std::getline(input,
line);
703template <
class G,
class C,
class S>
704void Gmsh4Reader<G,C,S>::readPartitionedEntitiesAscii (std::ifstream& input)
706 size_type numGhostEntities = 0;
707 size_type numPoints = 0, numCurves = 0, numSurfaces = 0, numVolumes = 0;
710 std::getline(input,
line);
712 std::istringstream stream(
line);
713 stream >> numPartitions_;
716 std::getline(input,
line);
718 std::istringstream stream(
line);
719 stream >> numGhostEntities;
722 ghostEntities_.reserve(numGhostEntities);
723 for (size_type i = 0; i < numGhostEntities; ++i) {
724 GhostAttributes attr;
725 stream >> attr.tag >> attr.partition;
727 ghostEntities_.push_back(attr);
729 GMSH4_ASSERT(ghostEntities_.size() == numGhostEntities);
732 std::getline(input,
line);
734 std::istringstream stream(
line);
735 stream >> numPoints >> numCurves >> numSurfaces >> numVolumes;
739 partitionedPoints_.reserve(numPoints);
740 for (size_type i = 0; i < numPoints; ++i) {
741 if (!std::getline(input,
line))
744 std::istringstream stream(
line);
745 PartitionedAttributes<PointAttributes> attr;
746 stream >> attr.tag >> attr.parentDim >> attr.parentTag;
748 size_type numPartitions = 0;
749 stream >> numPartitions;
750 attr.partitions.resize(numPartitions);
751 for (size_type j = 0; j < numPartitions; ++j)
752 stream >> attr.partitions[j];
754 stream >> attr.xyz[0] >> attr.xyz[1] >> attr.xyz[2];
756 size_type numPhysicalTags = 0;
757 stream >> numPhysicalTags;
758 attr.physicalTags.resize(numPhysicalTags);
759 for (size_type j = 0; j < numPhysicalTags; ++j)
760 stream >> attr.physicalTags[j];
762 partitionedPoints_.push_back(attr);
767 partitionedCurves_.reserve(numCurves);
768 for (size_type i = 0; i < numCurves; ++i) {
769 if (!std::getline(input,
line))
772 std::istringstream stream(
line);
773 PartitionedAttributes<EntityAttributes> attr;
774 stream >> attr.tag >> attr.parentDim >> attr.parentTag;
776 size_type numPartitions = 0;
777 stream >> numPartitions;
778 attr.partitions.resize(numPartitions);
779 for (size_type j = 0; j < numPartitions; ++j)
780 stream >> attr.partitions[j];
782 stream >> attr.min_xyz[0] >> attr.min_xyz[1] >> attr.min_xyz[2]
783 >> attr.max_xyz[0] >> attr.max_xyz[1] >> attr.max_xyz[2];
785 size_type numPhysicalTags = 0;
786 stream >> numPhysicalTags;
787 attr.physicalTags.resize(numPhysicalTags);
788 for (size_type j = 0; j < numPhysicalTags; ++j)
789 stream >> attr.physicalTags[j];
791 size_type numBoundingPoints = 0;
792 stream >> numBoundingPoints;
793 attr.boundingEntities.resize(numBoundingPoints);
794 for (size_type j = 0; j < numBoundingPoints; ++j)
795 stream >> attr.boundingEntities[j];
797 partitionedCurves_.push_back(attr);
802 partitionedSurfaces_.reserve(numSurfaces);
803 for (size_type i = 0; i < numSurfaces; ++i) {
804 if (!std::getline(input,
line))
807 std::istringstream stream(
line);
808 PartitionedAttributes<EntityAttributes> attr;
809 stream >> attr.tag >> attr.parentDim >> attr.parentTag;
811 size_type numPartitions = 0;
812 stream >> numPartitions;
813 attr.partitions.resize(numPartitions);
814 for (size_type j = 0; j < numPartitions; ++j)
815 stream >> attr.partitions[j];
817 stream >> attr.min_xyz[0] >> attr.min_xyz[1] >> attr.min_xyz[2]
818 >> attr.max_xyz[0] >> attr.max_xyz[1] >> attr.max_xyz[2];
820 size_type numPhysicalTags = 0;
821 stream >> numPhysicalTags;
822 attr.physicalTags.resize(numPhysicalTags);
823 for (size_type j = 0; j < numPhysicalTags; ++j)
824 stream >> attr.physicalTags[j];
826 size_type numBoundingCurves = 0;
827 stream >> numBoundingCurves;
828 attr.boundingEntities.resize(numBoundingCurves);
829 for (size_type j = 0; j < numBoundingCurves; ++j)
830 stream >> attr.boundingEntities[j];
832 partitionedSurfaces_.push_back(attr);
834 GMSH4_ASSERT(partitionedSurfaces_.size() == numSurfaces);
837 partitionedVolumes_.reserve(numVolumes);
838 for (size_type i = 0; i < numVolumes; ++i) {
839 if (!std::getline(input,
line))
842 std::istringstream stream(
line);
843 PartitionedAttributes<EntityAttributes> attr;
844 stream >> attr.tag >> attr.parentDim >> attr.parentTag;
846 size_type numPartitions = 0;
847 stream >> numPartitions;
848 attr.partitions.resize(numPartitions);
849 for (size_type j = 0; j < numPartitions; ++j)
850 stream >> attr.partitions[j];
852 stream >> attr.min_xyz[0] >> attr.min_xyz[1] >> attr.min_xyz[2]
853 >> attr.max_xyz[0] >> attr.max_xyz[1] >> attr.max_xyz[2];
855 size_type numPhysicalTags = 0;
856 stream >> numPhysicalTags;
857 attr.physicalTags.resize(numPhysicalTags);
858 for (size_type j = 0; j < numPhysicalTags; ++j)
859 stream >> attr.physicalTags[j];
861 size_type numBoundingSurfaces = 0;
862 stream >> numBoundingSurfaces;
863 attr.boundingEntities.resize(numBoundingSurfaces);
864 for (size_type j = 0; j < numBoundingSurfaces; ++j)
865 stream >> attr.boundingEntities[j];
867 partitionedVolumes_.push_back(attr);
873template <
class G,
class C,
class S>
874void Gmsh4Reader<G,C,S>::readPartitionedEntitiesBinary (std::ifstream& input)
876 size_type numGhostEntities = 0;
877 size_type numPoints = 0, numCurves = 0, numSurfaces = 0, numVolumes = 0;
879 readValueBinary(input, numPartitions_);
882 readValueBinary(input, numGhostEntities);
883 ghostEntities_.reserve(numGhostEntities);
884 for (size_type i = 0; i < numGhostEntities; ++i) {
885 GhostAttributes attr;
886 readValueBinary(input, attr.tag);
887 readValueBinary(input, attr.partition);
888 ghostEntities_.push_back(attr);
890 GMSH4_ASSERT(ghostEntities_.size() == numGhostEntities);
892 readValueBinary(input, numPoints);
893 readValueBinary(input, numCurves);
894 readValueBinary(input, numSurfaces);
895 readValueBinary(input, numVolumes);
898 partitionedPoints_.reserve(numPoints);
899 for (size_type i = 0; i < numPoints; ++i) {
900 PartitionedAttributes<PointAttributes> attr;
902 readValueBinary(input, attr.tag);
903 readValueBinary(input, attr.parentDim);
904 readValueBinary(input, attr.parentTag);
906 size_type numPartitions = 0;
907 readValueBinary(input, numPartitions);
908 attr.partitions.resize(numPartitions);
909 for (size_type j = 0; j < numPartitions; ++j)
910 readValueBinary(input, attr.partitions[j]);
912 readValueBinary(input, attr.xyz[0]);
913 readValueBinary(input, attr.xyz[1]);
914 readValueBinary(input, attr.xyz[2]);
916 size_type numPhysicalTags = 0;
917 readValueBinary(input, numPhysicalTags);
918 attr.physicalTags.resize(numPhysicalTags);
919 for (size_type j = 0; j < numPhysicalTags; ++j)
920 readValueBinary(input, attr.physicalTags[j]);
922 partitionedPoints_.push_back(attr);
927 partitionedCurves_.reserve(numCurves);
928 for (size_type i = 0; i < numCurves; ++i) {
929 PartitionedAttributes<EntityAttributes> attr;
931 readValueBinary(input, attr.tag);
932 readValueBinary(input, attr.parentDim);
933 readValueBinary(input, attr.parentTag);
935 size_type numPartitions = 0;
936 readValueBinary(input, numPartitions);
937 attr.partitions.resize(numPartitions);
938 for (size_type j = 0; j < numPartitions; ++j)
939 readValueBinary(input, attr.partitions[j]);
941 readValueBinary(input, attr.min_xyz[0]);
942 readValueBinary(input, attr.min_xyz[1]);
943 readValueBinary(input, attr.min_xyz[2]);
944 readValueBinary(input, attr.max_xyz[0]);
945 readValueBinary(input, attr.max_xyz[1]);
946 readValueBinary(input, attr.max_xyz[2]);
948 size_type numPhysicalTags = 0;
949 readValueBinary(input, numPhysicalTags);
950 attr.physicalTags.resize(numPhysicalTags);
951 for (size_type j = 0; j < numPhysicalTags; ++j)
952 readValueBinary(input, attr.physicalTags[j]);
954 size_type numBoundingPoints = 0;
955 readValueBinary(input, numBoundingPoints);
956 attr.boundingEntities.resize(numBoundingPoints);
957 for (size_type j = 0; j < numBoundingPoints; ++j)
958 readValueBinary(input, attr.boundingEntities[j]);
960 partitionedCurves_.push_back(attr);
965 partitionedSurfaces_.reserve(numSurfaces);
966 for (size_type i = 0; i < numSurfaces; ++i) {
967 PartitionedAttributes<EntityAttributes> attr;
969 readValueBinary(input, attr.tag);
970 readValueBinary(input, attr.parentDim);
971 readValueBinary(input, attr.parentTag);
973 size_type numPartitions = 0;
974 readValueBinary(input, numPartitions);
975 attr.partitions.resize(numPartitions);
976 for (size_type j = 0; j < numPartitions; ++j)
977 readValueBinary(input, attr.partitions[j]);
979 readValueBinary(input, attr.min_xyz[0]);
980 readValueBinary(input, attr.min_xyz[1]);
981 readValueBinary(input, attr.min_xyz[2]);
982 readValueBinary(input, attr.max_xyz[0]);
983 readValueBinary(input, attr.max_xyz[1]);
984 readValueBinary(input, attr.max_xyz[2]);
986 size_type numPhysicalTags = 0;
987 readValueBinary(input, numPhysicalTags);
988 attr.physicalTags.resize(numPhysicalTags);
989 for (size_type j = 0; j < numPhysicalTags; ++j)
990 readValueBinary(input, attr.physicalTags[j]);
992 size_type numBoundingCurves = 0;
993 readValueBinary(input, numBoundingCurves);
994 attr.boundingEntities.resize(numBoundingCurves);
995 for (size_type j = 0; j < numBoundingCurves; ++j)
996 readValueBinary(input, attr.boundingEntities[j]);
998 partitionedSurfaces_.push_back(attr);
1000 GMSH4_ASSERT(partitionedSurfaces_.size() == numSurfaces);
1003 partitionedVolumes_.reserve(numVolumes);
1004 for (size_type i = 0; i < numVolumes; ++i) {
1005 PartitionedAttributes<EntityAttributes> attr;
1007 readValueBinary(input, attr.tag);
1008 readValueBinary(input, attr.parentDim);
1009 readValueBinary(input, attr.parentTag);
1011 size_type numPartitions = 0;
1012 readValueBinary(input, numPartitions);
1013 attr.partitions.resize(numPartitions);
1014 for (size_type j = 0; j < numPartitions; ++j)
1015 readValueBinary(input, attr.partitions[j]);
1017 readValueBinary(input, attr.min_xyz[0]);
1018 readValueBinary(input, attr.min_xyz[1]);
1019 readValueBinary(input, attr.min_xyz[2]);
1020 readValueBinary(input, attr.max_xyz[0]);
1021 readValueBinary(input, attr.max_xyz[1]);
1022 readValueBinary(input, attr.max_xyz[2]);
1024 size_type numPhysicalTags = 0;
1025 readValueBinary(input, numPhysicalTags);
1026 attr.physicalTags.resize(numPhysicalTags);
1027 for (size_type j = 0; j < numPhysicalTags; ++j)
1028 readValueBinary(input, attr.physicalTags[j]);
1030 size_type numBoundingSurfaces = 0;
1031 readValueBinary(input, numBoundingSurfaces);
1032 attr.boundingEntities.resize(numBoundingSurfaces);
1033 for (size_type j = 0; j < numBoundingSurfaces; ++j)
1034 readValueBinary(input, attr.boundingEntities[j]);
1036 partitionedVolumes_.push_back(attr);
1038 GMSH4_ASSERT(partitionedVolumes_.size() == numVolumes);
1040 std::getline(input,
line);
1044template <
class G,
class C,
class S>
1045void Gmsh4Reader<G,C,S>::readNodesAscii (std::ifstream& input)
1047 size_type numEntityBlocks = 0;
1050 std::getline(input,
line);
1052 std::istringstream stream(
line);
1053 stream >> numEntityBlocks >> numNodes_ >> minNodeTag_ >> maxNodeTag_;
1056 nodes_.resize(numEntityBlocks);
1057 for (size_type i = 0; i < numEntityBlocks; ++i) {
1058 if (!std::getline(input,
line))
1061 auto& entityBlock = nodes_[i];
1062 size_type numNodesInBlock = 0;
1064 std::istringstream stream(
line);
1065 stream >> entityBlock.entityDim >> entityBlock.entityTag >> entityBlock.parametric >> numNodesInBlock;
1067 entityBlock.nodes.resize(numNodesInBlock);
1068 for (size_type j = 0; j < numNodesInBlock; ++j) {
1069 if (!std::getline(input,
line))
1073 entityBlock.nodes[j].tag = std::strtoul(
line.data(), &end, 10);
1076 for (size_type j = 0; j < numNodesInBlock; ++j) {
1077 if (!std::getline(input,
line))
1080 auto& node = entityBlock.nodes[j];
1082 std::istringstream stream(
line);
1083 stream >> node.xyz[0] >> node.xyz[1] >> node.xyz[2];
1085 if (entityBlock.parametric && entityBlock.entityDim >= 1)
1086 stream >> node.uvw[0];
1087 if (entityBlock.parametric && entityBlock.entityDim >= 2)
1088 stream >> node.uvw[1];
1089 if (entityBlock.parametric && entityBlock.entityDim == 3)
1090 stream >> node.uvw[2];
1096template <
class G,
class C,
class S>
1097void Gmsh4Reader<G,C,S>::readNodesBinary (std::ifstream& input)
1099 size_type numEntityBlocks = 0;
1100 readValueBinary(input, numEntityBlocks);
1101 readValueBinary(input, numNodes_);
1102 readValueBinary(input, minNodeTag_);
1103 readValueBinary(input, maxNodeTag_);
1105 nodes_.resize(numEntityBlocks);
1106 for (size_type i = 0; i < numEntityBlocks; ++i) {
1107 auto& entityBlock = nodes_[i];
1108 size_type numNodesInBlock = 0;
1110 readValueBinary(input, entityBlock.entityDim);
1111 readValueBinary(input, entityBlock.entityTag);
1112 readValueBinary(input, entityBlock.parametric);
1113 readValueBinary(input, numNodesInBlock);
1115 entityBlock.nodes.resize(numNodesInBlock);
1116 for (size_type j = 0; j < numNodesInBlock; ++j)
1117 readValueBinary(input, entityBlock.nodes[j].tag);
1119 for (size_type j = 0; j < numNodesInBlock; ++j) {
1120 auto& node = entityBlock.nodes[j];
1122 readValueBinary(input, node.xyz[0]);
1123 readValueBinary(input, node.xyz[1]);
1124 readValueBinary(input, node.xyz[2]);
1126 if (entityBlock.parametric && entityBlock.entityDim >= 1)
1127 readValueBinary(input, node.uvw[0]);
1128 if (entityBlock.parametric && entityBlock.entityDim >= 2)
1129 readValueBinary(input, node.uvw[1]);
1130 if (entityBlock.parametric && entityBlock.entityDim == 3)
1131 readValueBinary(input, node.uvw[2]);
1135 std::getline(input,
line);
1139template <
class G,
class C,
class S>
1140void Gmsh4Reader<G,C,S>::readElementsAscii (std::ifstream& input)
1142 size_type numEntityBlocks = 0;
1143 size_type numElementsInBlock = 0;
1146 std::getline(input,
line);
1148 std::istringstream stream(
line);
1149 stream >> numEntityBlocks >> numElements_ >> minElementTag_ >> maxElementTag_;
1152 elements_.resize(numEntityBlocks);
1153 for (size_type i = 0; i < numEntityBlocks; ++i) {
1154 if (!std::getline(input,
line))
1157 auto& entityBlock = elements_[i];
1159 std::istringstream stream(
line);
1160 stream >> entityBlock.entityDim >> entityBlock.entityTag >> entityBlock.elementType >> numElementsInBlock;
1162 size_type numNodes = elementType_[entityBlock.elementType];
1164 entityBlock.elements.resize(numElementsInBlock);
1165 for (size_type j = 0; j < numElementsInBlock; ++j) {
1166 if (!std::getline(input,
line))
1169 auto& element = entityBlock.elements[j];
1171 std::istringstream stream(
line);
1172 stream >> element.tag;
1173 element.nodes.resize(numNodes);
1174 for (size_type k = 0; k < numNodes; ++k)
1175 stream >> element.nodes[k];
1181template <
class G,
class C,
class S>
1182void Gmsh4Reader<G,C,S>::readElementsBinary (std::ifstream& input)
1184 size_type numEntityBlocks = 0;
1185 size_type numElementsInBlock = 0;
1187 readValueBinary(input, numEntityBlocks);
1188 readValueBinary(input, numElements_);
1189 readValueBinary(input, minElementTag_);
1190 readValueBinary(input, maxElementTag_);
1192 elements_.resize(numEntityBlocks);
1193 for (size_type i = 0; i < numEntityBlocks; ++i) {
1194 auto& entityBlock = elements_[i];
1196 readValueBinary(input, entityBlock.entityDim);
1197 readValueBinary(input, entityBlock.entityTag);
1198 readValueBinary(input, entityBlock.elementType);
1199 readValueBinary(input, numElementsInBlock);
1201 size_type numNodes = elementType_[entityBlock.elementType];
1203 entityBlock.elements.resize(numElementsInBlock);
1204 for (size_type j = 0; j < numElementsInBlock; ++j) {
1205 auto& element = entityBlock.elements[j];
1206 readValueBinary(input, element.tag);
1207 element.nodes.resize(numNodes);
1208 for (size_type k = 0; k < numNodes; ++k)
1209 readValueBinary(input, element.nodes[k]);
1213 std::getline(input,
line);
1217template <
class G,
class C,
class S>
1218void Gmsh4Reader<G,C,S>::readPeriodic (std::ifstream& )
1220 std::cout <<
"WARNING: readPeriodic() is not yet implemented. Section will be ignored." << std::endl;
1223template <
class G,
class C,
class S>
1224void Gmsh4Reader<G,C,S>::readGhostElements (std::ifstream& )
1226 std::cout <<
"WARNING: readGhostElements() is not yet implemented. Section will be ignored." << std::endl;
1229template <
class G,
class C,
class S>
1230void Gmsh4Reader<G,C,S>::readParametrization (std::ifstream& )
1232 std::cout <<
"WARNING: readParametrization() is not yet implemented. Section will be ignored." << std::endl;
1235template <
class G,
class C,
class S>
1236void Gmsh4Reader<G,C,S>::readNodeData (std::ifstream& )
1238 std::cout <<
"WARNING: readNodeData() is not yet implemented. Section will be ignored." << std::endl;
1241template <
class G,
class C,
class S>
1242void Gmsh4Reader<G,C,S>::readElementData (std::ifstream& )
1244 std::cout <<
"WARNING: readElementData() is not yet implemented. Section will be ignored." << std::endl;
1247template <
class G,
class C,
class S>
1248void Gmsh4Reader<G,C,S>::readElementNodeData (std::ifstream& )
1250 std::cout <<
"WARNING: readElementNodeData() is not yet implemented. Section will be ignored." << std::endl;
1253template <
class G,
class C,
class S>
1254void Gmsh4Reader<G,C,S>::readInterpolationScheme (std::ifstream& )
1256 std::cout <<
"WARNING: readInterpolationScheme() is not yet implemented. Section will be ignored." << std::endl;
1260template <
class G,
class C,
class S>
1263 if (!nodes_.empty())
1264 creator_->insertVertices(numNodes_, {minNodeTag_, maxNodeTag_}, nodes_);
1265 if (!elements_.empty()) {
1266 std::set<int> boundaryEntities;
1267 creator_->insertElements(numElements_, {minElementTag_, maxElementTag_}, elements_, boundaryEntities);
1270 creator_->insertPieces(pieces_);
File-Reader for GMsh unstructured .msh files.
Definition: gmsh4reader.hh:32
void readSerialFileFromStream(std::ifstream &input, bool fillCreator=true)
Read the grid from an input stream, referring to a .msh file, into the GridCreator.
Definition: gmsh4reader.impl.hh:340
void fillGridCreator(bool insertPieces=true)
Construct a grid using the GridCreator.
Definition: gmsh4reader.impl.hh:1261
void read(std::string const &filename, bool fillCreator=true)
Read the grid from file with filename into the GridFactory stored in the GridCreator.
Definition: gmsh4reader.impl.hh:271
void readParallelFileFromStream(std::ifstream &input, int rank, int size, bool fillCreator=true)
Read the grid from and input stream, referring to a .pro file, into the GridCreator.
Definition: gmsh4reader.impl.hh:413
static std::unique_ptr< Grid > read(const std::string &fileName, bool verbose=true, bool insertBoundarySegments=true)
Definition: gmshreader.hh:203
Default exception class for I/O errors.
Definition: exceptions.hh:325
Default exception for dummy implementations.
Definition: exceptions.hh:357
Macro for wrapping error checks and throwing exceptions.
#define GMSH4_ASSERT(cond)
check if condition cond holds; otherwise, throw a Gmsh4Error.
Definition: errors.hh:34
#define GMSH4_ASSERT_MSG(cond, text)
check if condition cond holds; otherwise, throw a Gmsh4Error with a message.
Definition: errors.hh:24
#define DUNE_THROW(E,...)
Definition: exceptions.hh:314
constexpr GeometryType line
GeometryType representing a line.
Definition: type.hh:498
auto elements(const SubDomainGridView< HostGridView > &subDomainGridView)
ADL findable access to element range for a SubDomainGridView.
Definition: subdomain.hh:487
Dune namespace
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75