1313#include < lsExpand.hpp>
1414#include < lsRemoveStrayPoints.hpp>
1515#include < lsToDiskMesh.hpp>
16+ #include < lsToHullMesh.hpp>
1617#include < lsToMesh.hpp>
1718#include < lsToMultiSurfaceMesh.hpp>
1819#include < lsToSurfaceMesh.hpp>
@@ -466,34 +467,17 @@ VIENNAPS_TEMPLATE_ND(NumericType, D) class Domain {
466467 return meshes;
467468 }
468469
469- // Save the level set as a VTK file.
470- void saveLevelSetMesh (const std::string &fileName, int width = 1 ) {
471- auto meshes = getLevelSetMesh (width);
472- for (int i = 0 ; i < meshes.size (); i++) {
473- viennals::VTKWriter<NumericType> writer (
474- meshes[i], fileName + " _layer" + std::to_string (i) + " .vtp" );
475- writer.setMetaData (metaData_);
476- writer.apply ();
477- }
478- }
479-
480470 SmartPointer<viennals::Mesh<NumericType>>
481- getSurfaceMesh (bool addInterfaces = false , double wrappingLayerEpsilon = 0.01 ,
482- bool boolMaterials = false ) const {
471+ getSurfaceMesh (bool addInterfaces = false , bool sharpCorners = false ,
472+ double wrappingLayerEpsilon = 0.01 ) const {
483473 auto mesh = viennals::Mesh<NumericType>::New ();
484474 if (addInterfaces) {
485475 viennals::ToMultiSurfaceMesh<NumericType, D> meshConverter (
486476 mesh, 1e-12 , wrappingLayerEpsilon);
487- for (unsigned i = 0 ; i < levelSets_.size (); i++) {
488- auto lsCopy = lsDomainType::New (levelSets_.at (i));
489- if (i > 0 && boolMaterials) {
490- viennals::BooleanOperation<NumericType, D>(
491- lsCopy, levelSets_.at (i - 1 ),
492- viennals::BooleanOperationEnum::RELATIVE_COMPLEMENT )
493- .apply ();
494- }
495- meshConverter.insertNextLevelSet (lsCopy);
477+ for (const auto &ls : levelSets_) {
478+ meshConverter.insertNextLevelSet (ls);
496479 }
480+ meshConverter.setSharpCorners (sharpCorners);
497481 meshConverter.setMaterialMap (materialMap_->getMaterialMap ());
498482 meshConverter.apply ();
499483 } else {
@@ -510,46 +494,68 @@ VIENNAPS_TEMPLATE_ND(NumericType, D) class Domain {
510494 {" MaterialIds" })
511495 .apply ();
512496
513- viennals::ToSurfaceMesh<NumericType, D>(levelSets_.back (), mesh).apply ();
497+ viennals::ToSurfaceMesh<NumericType, D> surfMesher (levelSets_.back (),
498+ mesh);
499+ surfMesher.setSharpCorners (sharpCorners);
500+ surfMesher.apply ();
514501 }
515502
516503 return mesh;
517504 }
518505
506+ SmartPointer<viennals::Mesh<NumericType>>
507+ getHullMesh (NumericType bottomExtension = 0.0 ,
508+ bool sharpCorners = false ) const {
509+ auto mesh = viennals::Mesh<NumericType>::New ();
510+ viennals::ToHullMesh<NumericType, D> meshConverter (mesh);
511+ for (unsigned i = 0 ; i < levelSets_.size (); i++) {
512+ meshConverter.insertNextLevelSet (levelSets_.at (i));
513+ }
514+ meshConverter.setMaterialMap (materialMap_->getMaterialMap ());
515+ meshConverter.setSharpCorners (sharpCorners);
516+ meshConverter.setBottomExtension (bottomExtension);
517+ meshConverter.apply ();
518+ return mesh;
519+ }
520+
521+ // Save the level set as a VTK file.
522+ void saveLevelSetMesh (const std::string &fileName, int width = 1 ) {
523+ auto meshes = getLevelSetMesh (width);
524+ for (int i = 0 ; i < meshes.size (); i++) {
525+ viennals::VTKWriter<NumericType> writer (
526+ meshes[i], fileName + " _layer" + std::to_string (i) + " .vtp" );
527+ writer.setMetaData (metaData_);
528+ writer.apply ();
529+ }
530+ }
531+
519532 // Print the top Level-Set (surface) in a VTK file format (vtp).
520- void saveSurfaceMesh (std::string fileName, bool addInterfaces = true ,
521- double wrappingLayerEpsilon = 0.01 ,
522- bool boolMaterials = false ) const {
533+ void saveSurfaceMesh (const std::string & fileName, bool addInterfaces = true ,
534+ bool sharpCorners = false ,
535+ double wrappingLayerEpsilon = 0.01 ) const {
523536 auto mesh =
524- getSurfaceMesh (addInterfaces, wrappingLayerEpsilon, boolMaterials );
537+ getSurfaceMesh (addInterfaces, sharpCorners, wrappingLayerEpsilon );
525538 viennals::VTKWriter<NumericType> writer (mesh, fileName);
526539 writer.setMetaData (metaData_);
527540 writer.apply ();
528541 }
529542
530- // Save the domain as a volume mesh
531- void
532- saveVolumeMesh (std::string fileName,
533- double wrappingLayerEpsilon = DEFAULT_WRAPPING_EPSILON ) const {
534- viennals::WriteVisualizationMesh<NumericType, D> writer;
535- writer.setFileName (fileName);
536- writer.setWrappingLayerEpsilon (wrappingLayerEpsilon);
537- for (auto &ls : levelSets_) {
538- writer.insertNextLevelSet (ls);
539- }
540- writer.setMaterialMap (materialMap_->getMaterialMap ());
543+ void saveHullMesh (const std::string &fileName,
544+ NumericType bottomExtension = 0.0 ,
545+ bool sharpCorners = false ) const {
546+ auto mesh = getHullMesh (bottomExtension, sharpCorners);
547+ viennals::VTKWriter<NumericType> writer (mesh, fileName);
541548 writer.setMetaData (metaData_);
542549 writer.apply ();
543550 }
544551
552+ // Save the domain as a volume mesh
545553 void
546- saveHullMesh ( std::string fileName,
547- double wrappingLayerEpsilon = DEFAULT_WRAPPING_EPSILON ) const {
554+ saveVolumeMesh ( const std::string & fileName,
555+ double wrappingLayerEpsilon = DEFAULT_WRAPPING_EPSILON ) const {
548556 viennals::WriteVisualizationMesh<NumericType, D> writer;
549557 writer.setFileName (fileName);
550558 writer.setWrappingLayerEpsilon (wrappingLayerEpsilon);
551- writer.setExtractHullMesh (true );
552- writer.setExtractVolumeMesh (false );
553559 for (auto &ls : levelSets_) {
554560 writer.insertNextLevelSet (ls);
555561 }
0 commit comments