From 1ef3d0e182b9eef36b0222f3ed1dc539d45db55d Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 9 Nov 2023 09:19:05 -0700 Subject: [PATCH 01/12] Misc cleanups and nano-fixes * Remove T suffixes, leftover from Epetra-vs-Teuchos/Tpetra * Use in-house util to extract MPI_Comm from Teuchos comm * Remove Albany:: scoping when already inside Albany namespace * Use Teuchos_Comm alias * Remove pointless empty return statements at the end of some methods * Use 'default' rather than empty impl for trivial ctors/dtors * Remove unused BucketArray file. * Minor cleanup (C++11) of PopulateMesh problem * Removed unused method in MpasSTKMeshStruct * Removed unused flag in STK meshes * Removed unused methods in DiscretizationFactory * Removed unused and empty override in OmegahBoxMesh * Remove unused files in ExoMeshes * Fix bug in STK0D mesh * Fix permissions on a src file * Removed ifdeffed out code in ioss stk mesh * If not restarting, no need to get solution from mesh during init * Use range-for loops rather than old iterator loops * In OrdinarySTKFieldContainer, output sensitivities only if they were requested * No need to add state structs in both solution and non-solutoin field containers They would only get added once in STK anyways, so add them only when handling the solution field container * In MultiSTKFieldContainer, no need to add coords also in the solution field container, for the same reason as above. * Remove humboldt partitioned meshes, since we partition them on the fly, during FIXTURE_SETUP tests --- src/SolutionManager.cpp | 4 +- src/corePDEs/problems/Albany_PopulateMesh.cpp | 5 - src/corePDEs/problems/Albany_PopulateMesh.hpp | 12 +- src/disc/Albany_AbstractMeshStruct.hpp | 43 ++- src/disc/Albany_DiscretizationFactory.cpp | 29 +- src/disc/Albany_DiscretizationFactory.hpp | 65 ++-- src/disc/omegah/Albany_OmegahBoxMesh.hpp | 2 +- src/disc/omegah/Albany_OmegahGenericMesh.cpp | 2 +- src/disc/omegah/Albany_OmegahGenericMesh.hpp | 2 +- src/disc/omegah/Albany_OmegahOshMesh.hpp | 2 +- src/disc/stk/Albany_AbstractSTKMeshStruct.hpp | 7 +- src/disc/stk/Albany_AsciiSTKMesh2D.cpp | 78 ++--- src/disc/stk/Albany_AsciiSTKMesh2D.hpp | 21 +- src/disc/stk/Albany_AsciiSTKMeshStruct.cpp | 15 +- src/disc/stk/Albany_AsciiSTKMeshStruct.hpp | 8 +- src/disc/stk/Albany_BucketArray.hpp | 181 ----------- src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 20 +- src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 46 ++- src/disc/stk/Albany_GenericSTKMeshStruct.hpp | 76 ++--- src/disc/stk/Albany_GmshSTKMeshStruct.cpp | 304 +++++++----------- src/disc/stk/Albany_GmshSTKMeshStruct.hpp | 24 +- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 130 ++++---- src/disc/stk/Albany_IossSTKMeshStruct.hpp | 12 +- .../stk/Albany_MultiSTKFieldContainer.cpp | 30 -- .../stk/Albany_MultiSTKFieldContainer.hpp | 1 - .../stk/Albany_OrdinarySTKFieldContainer.cpp | 14 +- .../stk/Albany_OrdinarySTKFieldContainer.hpp | 3 +- src/disc/stk/Albany_STK3DPointStruct.cpp | 47 ++- src/disc/stk/Albany_STK3DPointStruct.hpp | 20 +- src/disc/stk/Albany_STKDiscretization.cpp | 5 - src/disc/stk/Albany_STKNodeFieldContainer.hpp | 1 - src/disc/stk/Albany_SideSetSTKMeshStruct.cpp | 62 ++-- src/disc/stk/Albany_SideSetSTKMeshStruct.hpp | 2 +- src/disc/stk/Albany_TmplSTKMeshStruct.hpp | 38 +-- src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp | 75 +++-- .../Albany_CismSTKMeshStruct.cpp | 0 .../Albany_MpasSTKMeshStruct.cpp | 12 - .../Albany_MpasSTKMeshStruct.hpp | 2 - .../AsciiMeshes/Humboldt/CMakeLists.txt | 16 - .../AsciiMeshes/Humboldt/humboldt_2d.exo.4.0 | Bin 47520 -> 0 bytes .../AsciiMeshes/Humboldt/humboldt_2d.exo.4.1 | Bin 47448 -> 0 bytes .../AsciiMeshes/Humboldt/humboldt_2d.exo.4.2 | Bin 46432 -> 0 bytes .../AsciiMeshes/Humboldt/humboldt_2d.exo.4.3 | Bin 46972 -> 0 bytes .../Humboldt/humboldt_contiguous_2d.exo.4.0 | Bin 45500 -> 0 bytes .../Humboldt/humboldt_contiguous_2d.exo.4.1 | Bin 45436 -> 0 bytes .../Humboldt/humboldt_contiguous_2d.exo.4.2 | Bin 44468 -> 0 bytes .../Humboldt/humboldt_contiguous_2d.exo.4.3 | Bin 44992 -> 0 bytes tests/landIce/Enthalpy/input_kleiner_B.yaml | 2 +- tests/landIce/ExoMeshes/CMakeLists.txt | 2 - tests/landIce/ExoMeshes/square_quad4.jou | 41 --- tests/landIce/ExoMeshes/square_quad9.jou | 43 --- tests/landIce/FO_GIS/CMakeLists.txt | 62 ++-- tests/unit/Albany_UnitTestSetupHelpers.hpp | 2 +- 53 files changed, 540 insertions(+), 1028 deletions(-) delete mode 100644 src/disc/stk/Albany_BucketArray.hpp mode change 100755 => 100644 src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.0 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.1 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.2 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.3 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.0 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.1 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.2 delete mode 100644 tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.3 delete mode 100644 tests/landIce/ExoMeshes/square_quad4.jou delete mode 100644 tests/landIce/ExoMeshes/square_quad9.jou diff --git a/src/SolutionManager.cpp b/src/SolutionManager.cpp index ab662c5b3a..14a9841662 100644 --- a/src/SolutionManager.cpp +++ b/src/SolutionManager.cpp @@ -84,7 +84,9 @@ SolutionManager::SolutionManager( // This call allocates the non-overlapped MV current_soln = Thyra::createMembers(owned_vs,num_time_deriv+1); - disc_->getSolutionMV(*current_soln); + if (disc_->hasRestartSolution()) { + disc_->getSolutionMV(*current_soln); + } // Create the CombineAndScatterManager for handling distributed memory linear // algebra communications diff --git a/src/corePDEs/problems/Albany_PopulateMesh.cpp b/src/corePDEs/problems/Albany_PopulateMesh.cpp index 2659e9ce4a..dbfc96c2ad 100644 --- a/src/corePDEs/problems/Albany_PopulateMesh.cpp +++ b/src/corePDEs/problems/Albany_PopulateMesh.cpp @@ -26,11 +26,6 @@ PopulateMesh::PopulateMesh (const Teuchos::RCP& params_, neq = 1; } -PopulateMesh::~PopulateMesh() -{ - // Nothing to be done here -} - void PopulateMesh::buildProblem (Teuchos::ArrayRCP> meshSpecs, StateManager& stateMgr) { diff --git a/src/corePDEs/problems/Albany_PopulateMesh.hpp b/src/corePDEs/problems/Albany_PopulateMesh.hpp index c2ffb2fb70..27e0c3855d 100644 --- a/src/corePDEs/problems/Albany_PopulateMesh.hpp +++ b/src/corePDEs/problems/Albany_PopulateMesh.hpp @@ -44,7 +44,7 @@ class PopulateMesh : public Albany::AbstractProblem const Teuchos::RCP& paramLib_); //! Destructor - ~PopulateMesh(); + ~PopulateMesh() = default; //! Return number of spatial dimensions virtual int spatialDimension() const { return 0; } @@ -66,16 +66,6 @@ class PopulateMesh : public Albany::AbstractProblem bool useSDBCs() const { return use_sdbcs_; } -private: - - //! Private to prohibit copying - PopulateMesh(const PopulateMesh&); - - //! Private to prohibit copying - PopulateMesh& operator=(const PopulateMesh&); - -public: - //! Main problem setup routine. Not directly called, but indirectly by following functions template Teuchos::RCP constructEvaluators (PHX::FieldManager& fm0, diff --git a/src/disc/Albany_AbstractMeshStruct.hpp b/src/disc/Albany_AbstractMeshStruct.hpp index 11291d9c67..098413dc04 100644 --- a/src/disc/Albany_AbstractMeshStruct.hpp +++ b/src/disc/Albany_AbstractMeshStruct.hpp @@ -36,30 +36,25 @@ struct AbstractMeshStruct { //! Internal mesh specs type needed virtual std::string meshType() const = 0; - virtual void setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}) = 0; - - virtual void setBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}) = 0; - - void setFieldAndBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}) - { - setFieldData(commT, sis, worksetSize, side_set_sis); - setBulkData(commT, sis, worksetSize, side_set_sis); - } - - virtual Teuchos::ArrayRCP >& getMeshSpecs() = 0; - virtual const Teuchos::ArrayRCP >& getMeshSpecs() const = 0; + virtual void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis = {}) = 0; + virtual void setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis = {}) = 0; + + void setFieldAndBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis = {}) + { + setFieldData(comm, sis, worksetSize, side_set_sis); + setBulkData(comm, sis, worksetSize, side_set_sis); + } + virtual Teuchos::ArrayRCP >& getMeshSpecs() = 0; + virtual const Teuchos::ArrayRCP >& getMeshSpecs() const = 0; Teuchos::RCP > global_cell_layers_data; Teuchos::RCP > local_cell_layers_data; diff --git a/src/disc/Albany_DiscretizationFactory.cpp b/src/disc/Albany_DiscretizationFactory.cpp index 65ea49eb98..b7787e0094 100644 --- a/src/disc/Albany_DiscretizationFactory.cpp +++ b/src/disc/Albany_DiscretizationFactory.cpp @@ -33,9 +33,9 @@ namespace Albany { DiscretizationFactory::DiscretizationFactory( const Teuchos::RCP& topLevelParams, - const Teuchos::RCP& commT_, + const Teuchos::RCP& comm_, const bool explicit_scheme_) : - commT(commT_), + comm(comm_), explicit_scheme(explicit_scheme_) { discParams = Teuchos::sublist(topLevelParams, "Discretization", true); @@ -51,7 +51,7 @@ DiscretizationFactory::DiscretizationFactory( Teuchos::ArrayRCP > DiscretizationFactory::createMeshSpecs() { // First, create the mesh struct - meshStruct = createMeshStruct(discParams, commT, num_params); + meshStruct = createMeshStruct(discParams, comm, num_params); return meshStruct->getMeshSpecs(); } @@ -158,13 +158,6 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis return Teuchos::null; } -Teuchos::RCP -DiscretizationFactory::createDiscretization(unsigned int neq, - const Teuchos::RCP& sis, - const Teuchos::RCP& rigidBodyModes) -{ - return createDiscretization(neq, empty_side_set_equations, sis, empty_side_set_sis, rigidBodyModes); -} Teuchos::RCP DiscretizationFactory::createDiscretization( @@ -215,7 +208,7 @@ DiscretizationFactory::setMeshStructFieldData( const std::map >& side_set_sis) { TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructFieldData"); - meshStruct->setFieldData(commT, sis, + meshStruct->setFieldData(comm, sis, meshStruct->getMeshSpecs()[0]->worksetSize, side_set_sis); } @@ -231,16 +224,10 @@ DiscretizationFactory::setMeshStructBulkData( const std::map >& side_set_sis) { TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructBulkData"); - meshStruct->setBulkData(commT, sis, + meshStruct->setBulkData(comm, sis, meshStruct->getMeshSpecs()[0]->worksetSize, side_set_sis); } -Teuchos::RCP -DiscretizationFactory::createDiscretizationFromInternalMeshStruct( - const int neq, - const Teuchos::RCP& rigidBodyModes) { - return createDiscretizationFromInternalMeshStruct(neq, empty_side_set_equations, rigidBodyModes); -} Teuchos::RCP DiscretizationFactory::createDiscretizationFromInternalMeshStruct( @@ -257,11 +244,11 @@ DiscretizationFactory::createDiscretizationFromInternalMeshStruct( Teuchos::RCP disc; if (meshStruct->meshType()=="STK") { auto ms = Teuchos::rcp_dynamic_cast(meshStruct); - disc = Teuchos::rcp(new STKDiscretization(discParams, neq, ms, commT, rigidBodyModes, sideSetEquations)); + disc = Teuchos::rcp(new STKDiscretization(discParams, neq, ms, comm, rigidBodyModes, sideSetEquations)); #ifdef ALBANY_OMEGAH } else if (meshStruct->meshType()=="Omega_h") { auto ms = Teuchos::rcp_dynamic_cast(meshStruct); - disc = Teuchos::rcp(new OmegahDiscretization(discParams, neq, ms, commT, rigidBodyModes, sideSetEquations)); + disc = Teuchos::rcp(new OmegahDiscretization(discParams, neq, ms, comm, rigidBodyModes, sideSetEquations)); #endif } return disc; @@ -269,7 +256,7 @@ DiscretizationFactory::createDiscretizationFromInternalMeshStruct( void DiscretizationFactory::setFieldData(Teuchos::RCP disc, - const Teuchos::RCP& sis) { + const Teuchos::RCP& sis) { if (meshStruct->meshType()=="STK") { auto stk_disc = Teuchos::rcp_dynamic_cast(disc); diff --git a/src/disc/Albany_DiscretizationFactory.hpp b/src/disc/Albany_DiscretizationFactory.hpp index 6da5a76583..968e4ed75b 100644 --- a/src/disc/Albany_DiscretizationFactory.hpp +++ b/src/disc/Albany_DiscretizationFactory.hpp @@ -29,94 +29,77 @@ class DiscretizationFactory { //! Default constructor DiscretizationFactory( const Teuchos::RCP& topLevelParams, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, const bool explicit_scheme_ = false); //! Destructor ~DiscretizationFactory() {} - static Teuchos::RCP + static Teuchos::RCP createMeshStruct (Teuchos::RCP disc_params, Teuchos::RCP comm, const int numParams); - Teuchos::RCP getMeshStruct() { - return meshStruct; - } + Teuchos::ArrayRCP > createMeshSpecs(); - Teuchos::ArrayRCP > createMeshSpecs(); + Teuchos::ArrayRCP > createMeshSpecs(Teuchos::RCP mesh); - Teuchos::ArrayRCP > createMeshSpecs(Teuchos::RCP mesh); - - Teuchos::RCP - createDiscretization(unsigned int num_equations, - const Teuchos::RCP& sis, - const Teuchos::RCP& rigidBodyModes = Teuchos::null); - Teuchos::RCP + Teuchos::RCP createDiscretization(unsigned int num_equations, const std::map >& sideSetEquations, - const Teuchos::RCP& sis, - const std::map >& side_set_sis, - const Teuchos::RCP& rigidBodyModes = Teuchos::null); + const Teuchos::RCP& sis, + const std::map >& side_set_sis, + const Teuchos::RCP& rigidBodyModes = Teuchos::null); void setMeshStructFieldData( - const Teuchos::RCP& sis); + const Teuchos::RCP& sis); void setMeshStructFieldData( - const Teuchos::RCP& sis, - const std::map >& side_set_sis); + const Teuchos::RCP& sis, + const std::map >& side_set_sis); void setMeshStructBulkData( - const Teuchos::RCP& sis); + const Teuchos::RCP& sis); void setMeshStructBulkData( - const Teuchos::RCP& sis, - const std::map >& side_set_sis); + const Teuchos::RCP& sis, + const std::map >& side_set_sis); - Teuchos::RCP createDiscretizationFromInternalMeshStruct( + Teuchos::RCP createDiscretizationFromInternalMeshStruct( const int neq, - const Teuchos::RCP& rigidBodyModes); + const Teuchos::RCP& rigidBodyModes); - Teuchos::RCP createDiscretizationFromInternalMeshStruct( + Teuchos::RCP createDiscretizationFromInternalMeshStruct( const int neq, const std::map >& sideSetEquations, - const Teuchos::RCP& rigidBodyModes); + const Teuchos::RCP& rigidBodyModes); /* This function overwrite previous discretization parameter list */ void setDiscretizationParameters(Teuchos::RCP disc_params); - private: - - //! Private to prohibit copying - DiscretizationFactory(const DiscretizationFactory&); - - //! Private to prohibit copying - DiscretizationFactory& operator=(const DiscretizationFactory&); + protected: const std::map > empty_side_set_equations; - const std::map > empty_side_set_sis; + const std::map > empty_side_set_sis; - void - setFieldData(Teuchos::RCP disc, - const Teuchos::RCP& sis); + void setFieldData (Teuchos::RCP disc, + const Teuchos::RCP& sis); void completeDiscSetup(Teuchos::RCP disc); - protected: - //! Parameter list specifying what element to create Teuchos::RCP discParams; //! Parameter list specifying solver parameters Teuchos::RCP piroParams; - Teuchos::RCP commT; + Teuchos::RCP comm; //The following are for Aeras hydrostatic problems int numLevels; @@ -125,7 +108,7 @@ class DiscretizationFactory { //Flag for explicit time-integration scheme, used in Aeras bool explicit_scheme; - Teuchos::RCP meshStruct; + Teuchos::RCP meshStruct; //Number of parameters int num_params = 0; diff --git a/src/disc/omegah/Albany_OmegahBoxMesh.hpp b/src/disc/omegah/Albany_OmegahBoxMesh.hpp index 9edaf55f10..4c90db0982 100644 --- a/src/disc/omegah/Albany_OmegahBoxMesh.hpp +++ b/src/disc/omegah/Albany_OmegahBoxMesh.hpp @@ -13,7 +13,7 @@ class OmegahBoxMesh : public OmegahGenericMesh { OmegahBoxMesh (const Teuchos::RCP& params, const Teuchos::RCP& comm, const int numParams); - void setBulkData (const Teuchos::RCP& commT, + void setBulkData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize, const std::map >& side_set_sis) override; diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.cpp b/src/disc/omegah/Albany_OmegahGenericMesh.cpp index 2b0573b23d..c41edd79d2 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.cpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.cpp @@ -5,7 +5,7 @@ namespace Albany { void OmegahGenericMesh:: -setFieldData (const Teuchos::RCP& commT, +setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize, const std::map >& side_set_sis) diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.hpp b/src/disc/omegah/Albany_OmegahGenericMesh.hpp index 4f811d5ed4..84b3a3cd32 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.hpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.hpp @@ -25,7 +25,7 @@ class OmegahGenericMesh : public AbstractMeshStruct { getMeshSpecs() const override { return m_mesh_specs; } - void setFieldData (const Teuchos::RCP& commT, + void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize, const std::map >& side_set_sis) override; diff --git a/src/disc/omegah/Albany_OmegahOshMesh.hpp b/src/disc/omegah/Albany_OmegahOshMesh.hpp index fb57c7b698..8f624523b0 100644 --- a/src/disc/omegah/Albany_OmegahOshMesh.hpp +++ b/src/disc/omegah/Albany_OmegahOshMesh.hpp @@ -11,7 +11,7 @@ class OmegahOshMesh : public OmegahGenericMesh OmegahOshMesh (const Teuchos::RCP& params, const Teuchos::RCP& comm, const int numParams); - void setBulkData (const Teuchos::RCP& commT, + void setBulkData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize, const std::map >& side_set_sis) override diff --git a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp index 89a6e16986..968bb26b50 100644 --- a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp @@ -133,9 +133,6 @@ struct AbstractSTKMeshStruct : public AbstractMeshStruct virtual double restartDataTime() const = 0; - virtual bool - useCompositeTet() = 0; - // Flag for transforming STK mesh; currently only needed for LandIce/Aeras // problems std::string transformType; @@ -177,8 +174,8 @@ struct AbstractSTKMeshStruct : public AbstractMeshStruct std::map>& sideNodeMap) = 0; // Useful for loading side meshes from file - bool side_maps_present; - bool ignore_side_maps; + bool side_maps_present = false; + bool ignore_side_maps = false; protected: Teuchos::RCP fieldContainer; diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp index d6dcb8f5f7..f7bc90ac53 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp @@ -32,11 +32,14 @@ #include "Albany_Utils.hpp" -Albany::AsciiSTKMesh2D::AsciiSTKMesh2D (const Teuchos::RCP& params, - const Teuchos::RCP& commT, - const int numParams) : - GenericSTKMeshStruct (params, 2, numParams), - periodic (false) +namespace Albany { + +AsciiSTKMesh2D:: +AsciiSTKMesh2D (const Teuchos::RCP& params, + const Teuchos::RCP& comm, + const int numParams) + : GenericSTKMeshStruct (params, 2, numParams) + , periodic (false) { NumElemNodes = NumNodes = NumElems = NumBdEdges = 0; @@ -45,7 +48,7 @@ Albany::AsciiSTKMesh2D::AsciiSTKMesh2D (const Teuchos::RCPgetRank() == 0) + if (comm->getRank() == 0) { std::ifstream ifile; @@ -166,9 +169,9 @@ Albany::AsciiSTKMesh2D::AsciiSTKMesh2D (const Teuchos::RCPvalidateParameters(*getValidDiscretizationParameters(), 0); std::string ebn = "Element Block 0"; - if (commT->getSize() > 0){ // running in parallel, need to exchange the topology with PE 0 + if (comm->getSize() > 0){ // running in parallel, need to exchange the topology with PE 0 int enum_to_int = static_cast(etopology); - Teuchos::broadcast(*commT,0,1,&enum_to_int); + Teuchos::broadcast(*comm,0,1,&enum_to_int); etopology = static_cast(enum_to_int); } partVec.push_back(&metaData->declare_part_with_topology(ebn, etopology)); @@ -207,12 +210,12 @@ Albany::AsciiSTKMesh2D::AsciiSTKMesh2D (const Teuchos::RCP(*commT, 0, &numBdNodeTags); + Teuchos::broadcast(*comm, 0, &numBdNodeTags); std::vector bdNodeTagsArray(numBdNodeTags); std::set::iterator it=bdNodeTags.begin(); for (int k=0; it!=bdNodeTags.end(); ++it,++k) bdNodeTagsArray[k] = *it; - Teuchos::broadcast(*commT, 0, numBdNodeTags, bdNodeTagsArray.data()); + Teuchos::broadcast(*comm, 0, numBdNodeTags, bdNodeTagsArray.data()); // Adding boundary nodesets and sidesets separating different labels for (int k=0; k(*commT, 0, &numBdEdgeTags); + Teuchos::broadcast(*comm, 0, &numBdEdgeTags); std::vector bdEdgeTagsArray(numBdEdgeTags); it=bdEdgeTags.begin(); for (int k=0; it!=bdEdgeTags.end(); ++it,++k) bdEdgeTagsArray[k] = *it; - Teuchos::broadcast(*commT, 0, numBdEdgeTags, bdEdgeTagsArray.data()); + Teuchos::broadcast(*comm, 0, numBdEdgeTags, bdEdgeTagsArray.data()); // Adding boundary nodesets and sidesets separating different labels for (int k=0; kuniversal_part()); #endif - Teuchos::broadcast(*commT, 0, &NumElemNodes); + Teuchos::broadcast(*comm, 0, &NumElemNodes); if(NumElemNodes == 3) { stk::mesh::set_topology(*partVec[0], stk::topology::TRI_3_2D); } @@ -278,7 +281,7 @@ Albany::AsciiSTKMesh2D::AsciiSTKMesh2D (const Teuchos::RCPget("Workset Size", DEFAULT_WORKSET_SIZE); - Teuchos::broadcast(*commT, 0, &NumElems); + Teuchos::broadcast(*comm, 0, &NumElems); int worksetSize = this->computeWorksetSize(worksetSizeMax, NumElems); @@ -286,43 +289,41 @@ Albany::AsciiSTKMesh2D::AsciiSTKMesh2D (const Teuchos::RCPmeshSpecs[0] = Teuchos::rcp ( - new Albany::MeshSpecsStruct (ctd, numDim, nsNames, ssNames, + new MeshSpecsStruct (ctd, numDim, nsNames, ssNames, worksetSize, partVec[0]->name(), ebNameToIndex)); // Create a mesh specs object for EACH side set - this->initializeSideSetMeshSpecs(commT); + this->initializeSideSetMeshSpecs(comm); // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(commT); + this->initializeSideSetMeshStructs(comm); } -Albany::AsciiSTKMesh2D::~AsciiSTKMesh2D() {} - -void Albany::AsciiSTKMesh2D::setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& /* side_set_sis */) +void AsciiSTKMesh2D:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& /* side_set_sis */) { this->SetupFieldData(commT, sis, worksetSize); } -void Albany::AsciiSTKMesh2D::setBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void AsciiSTKMesh2D:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, + const unsigned int worksetSize, + const std::map >& side_set_sis) { metaData->commit(); bulkData->modification_begin(); // Begin modifying the mesh Teuchos::RCP out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout)); - out->setProcRankAndSize(commT->getRank(), commT->getSize()); + out->setProcRankAndSize(comm->getRank(), comm->getSize()); out->setOutputToRootOnly(0); // Only proc 0 has loaded the file - if (commT->getRank()==0) + if (comm->getRank()==0) { stk::mesh::PartVector singlePartVec(1); unsigned int ebNo = 0; //element block #??? @@ -363,7 +364,7 @@ void Albany::AsciiSTKMesh2D::setBulkData( if(proc_rank_field){ int* p_rank = stk::mesh::field_data(*proc_rank_field, elem); if(p_rank) - p_rank[0] = commT->getRank(); + p_rank[0] = comm->getRank(); } } *out << "done!\n"; @@ -434,19 +435,22 @@ void Albany::AsciiSTKMesh2D::setBulkData( params->set("Rebalance Mesh", true); // Rebalance the mesh before starting the simulation if indicated - rebalanceInitialMeshT(commT); + rebalanceInitialMesh(comm); #endif // Loading required input fields from file - this->loadRequiredInputFields (commT); + this->loadRequiredInputFields (comm); // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetFieldAndBulkData(commT, side_set_sis, worksetSize); + this->setSideSetFieldAndBulkData(comm, side_set_sis, worksetSize); fieldAndBulkDataSet = true; } -Teuchos::RCP Albany::AsciiSTKMesh2D::getValidDiscretizationParameters() const { +Teuchos::RCP +AsciiSTKMesh2D:: +getValidDiscretizationParameters() const +{ Teuchos::RCP validPL = this->getValidGenericSTKParameters("Valid ASCII_DiscParams"); validPL->set("Ascii Input Mesh File Name", "greenland.msh", @@ -456,3 +460,5 @@ Teuchos::RCP Albany::AsciiSTKMesh2D::getValidDiscr return validPL; } + +} // namespace Albany diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.hpp b/src/disc/stk/Albany_AsciiSTKMesh2D.hpp index a970ea9ba4..60b7322be5 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.hpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.hpp @@ -53,22 +53,21 @@ namespace Albany { public: - AsciiSTKMesh2D( - const Teuchos::RCP& params, - const Teuchos::RCP& commT, - const int numParams); + AsciiSTKMesh2D (const Teuchos::RCP& params, + const Teuchos::RCP& comm, + const int numParams); - ~AsciiSTKMesh2D(); + ~AsciiSTKMesh2D() = default; - void setFieldData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp index 69c7be1cc9..02dc8ca1c8 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp @@ -416,8 +416,8 @@ AsciiSTKMeshStruct::~AsciiSTKMeshStruct() } void -AsciiSTKMeshStruct::setFieldData( - const Teuchos::RCP& comm, +AsciiSTKMeshStruct:: +setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize, const std::map >& side_set_sis) @@ -426,12 +426,11 @@ AsciiSTKMeshStruct::setFieldData( this->setSideSetFieldData(comm, side_set_sis, worksetSize); } -void -AsciiSTKMeshStruct::setBulkData( - const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void AsciiSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, + const unsigned int worksetSize, + const std::map >& side_set_sis) { metaData->commit(); diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp index 7615a4f4f7..17e5be0dac 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp @@ -26,14 +26,14 @@ class AsciiSTKMeshStruct : public GenericSTKMeshStruct ~AsciiSTKMeshStruct(); void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } diff --git a/src/disc/stk/Albany_BucketArray.hpp b/src/disc/stk/Albany_BucketArray.hpp deleted file mode 100644 index b03ed865e1..0000000000 --- a/src/disc/stk/Albany_BucketArray.hpp +++ /dev/null @@ -1,181 +0,0 @@ -//*****************************************************************// -// Albany 3.0: Copyright 2016 Sandia Corporation // -// This Software is released under the BSD license detailed // -// in the file "license.txt" in the top-level Albany directory // -//*****************************************************************// - -#ifndef ALBANY_BUCKETARRAY_HPP -#define ALBANY_BUCKETARRAY_HPP - -#include -#include -#include -#include -#include -#include - -#include - -//#define IKT_DEBUG - -namespace Albany { - -struct EntityDimension : public shards::ArrayDimTag { - - const char * name() const - { static const char n[] = "EntityDimension" ; return n ; } - - static const EntityDimension & tag() ///< Singleton - { static const EntityDimension self ; return self ; } - -private: - EntityDimension() {} - EntityDimension( const EntityDimension & ); - EntityDimension & operator = ( const EntityDimension & ); -}; - -template< class FieldType > struct BucketArray {}; - -/** \brief \ref stk::mesh::Field "Field" data \ref shards::Array "Array" - * for a given scalar field and bucket - */ -template< typename ScalarType > -struct BucketArray< stk::mesh::Field > - : public -shards::Array -{ -private: - typedef unsigned char * byte_p ; - BucketArray(); - BucketArray( const BucketArray & ); - BucketArray & operator = ( const BucketArray & ); - -public: - - typedef stk::mesh::Field field_type ; - typedef - shards::Array - array_type ; - - BucketArray( const field_type & f , const stk::mesh::Bucket & k ) - { - if (k.field_data_is_allocated(f)) { - array_type::assign( (ScalarType*)( k.field_data_location(f) ) , - k.size() ); - - } - } -}; - -template -inline size_t -get_size(stk::mesh::Bucket const&) -{ - return Tag::Size; -} - -template <> -inline size_t -get_size(stk::mesh::Bucket const&) -{ - return 0; -} - -template <> -inline size_t -get_size(stk::mesh::Bucket const& b) -{ - return b.mesh().mesh_meta_data().spatial_dimension(); -} - -//---------------------------------------------------------------------- -/** \brief \ref stk::mesh::Field "Field" data \ref shards::Array "Array" - * for a given array field and bucket - */ -template< typename ScalarType , - class Tag1 , class Tag2 , class Tag3 , class Tag4 , - class Tag5 , class Tag6 , class Tag7 > -struct BucketArray< stk::mesh::Field > - : public shards::ArrayAppend< - shards::Array , - EntityDimension >::type -{ -private: - typedef unsigned char * byte_p ; - BucketArray(); - BucketArray( const BucketArray & ); - BucketArray & operator = ( const BucketArray & ); -public: - - typedef stk::mesh::Field field_type ; - - typedef typename shards::ArrayAppend< - shards::Array , - EntityDimension >::type array_type ; - - BucketArray( const field_type & f , const stk::mesh::Bucket & b ) - { - if ( b.field_data_is_allocated(f) ) { - int stride[4]; - if (f.field_array_rank() == 1) { - stride[0] = stk::mesh::field_scalars_per_entity(f, b); - } - else if (f.field_array_rank() == 2) { - int dim0 = stk::mesh::find_restriction(f, b.entity_rank(), b.supersets()).dimension(); - stride[0] = dim0; - stride[1] = stk::mesh::field_scalars_per_entity(f, b); - } - else if (f.field_array_rank() == 3) { -#ifdef IKT_DEBUG - std::cout << "IKT field array rank = 3" << std::endl; -#endif - int dim0 = stk::mesh::find_restriction(f, b.entity_rank(), b.supersets()).dimension(); -#ifdef IKT_DEBUG - std::cout << "IKT size tag1 = " << get_size(b) << std::endl; - std::cout << "IKT size tag2 = " << get_size(b) << std::endl; - std::cout << "IKT size tag3 = " << get_size(b) << std::endl; -#endif - if (dim0 == 4) { - stride[0] = dim0; - stride[1] = get_size(b) * dim0; - stride[2] = stk::mesh::field_scalars_per_entity(f, b); - } - else { - //IKT, 12/20/18: this changes the way the qp_tensor field - //for 1D and 3D problems appears in the output exodus field. - //Fields appear like: Cauchy_Stress_1_1, ... Cauchy_Stress_8_9, - //instead of Cauchy_Stress_1_01 .. Cauchy_Stress_3_24 to make it - //more clear which entry corresponds to which component/quad point. - //I believe for 2D problems the original layout is correct, hence - //the if statement above here. - stride[0] = get_size(b); - stride[1] = get_size(b) * stride[0]; - stride[2] = stk::mesh::field_scalars_per_entity(f, b); - } -#ifdef IKT_DEBUG - std::cout << "IKT stride0, stride1, stride2 = " << stride[0] << ", " << stride[1] << ", " << stride[2] << std::endl; -#endif - } - else if (f.field_array_rank() == 4) { - int dim0 = stk::mesh::find_restriction(f, b.entity_rank(), b.supersets()).dimension(); - stride[0] = dim0; - stride[1] = get_size(b) * dim0; - stride[2] = get_size(b) * stride[1]; - stride[3] = stk::mesh::field_scalars_per_entity(f, b); - } - else { - assert(false); - } - - array_type::assign_stride( - (ScalarType*)( b.field_data_location(f) ), - stride, - (typename array_type::size_type) b.size() ); - - } - } -}; - -} //namespace Albany - -#endif // ALBANY_BUCKETARRAY_HPP diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 790cff5861..0bc9c5c784 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -192,11 +192,11 @@ ExtrudedSTKMeshStruct(const Teuchos::RCP& params, this->initializeSideSetMeshStructs(comm); } -void ExtrudedSTKMeshStruct::setFieldData( - const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void ExtrudedSTKMeshStruct:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis) { out->setProcRankAndSize(comm->getRank(), comm->getSize()); out->setOutputToRootOnly(0); @@ -214,11 +214,11 @@ void ExtrudedSTKMeshStruct::setFieldData( this->setSideSetFieldData(comm, side_set_sis, worksetSize); } -void ExtrudedSTKMeshStruct::setBulkData( - const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void ExtrudedSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, + const unsigned int worksetSize, + const std::map >& side_set_sis) { constexpr auto ELEM_RANK = stk::topology::ELEM_RANK; constexpr auto NODE_RANK = stk::topology::NODE_RANK; diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index bebf2054c9..e97e99bdca 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -4,15 +4,18 @@ // in the file "license.txt" in the top-level Albany directory // //*****************************************************************// -#include -#include "Teuchos_VerboseObject.hpp" -#include "Teuchos_RCPStdSharedPtrConversions.hpp" - #include "Albany_DiscretizationFactory.hpp" #include "Albany_GenericSTKMeshStruct.hpp" #include "Albany_SideSetSTKMeshStruct.hpp" +#include +#include +#include +#include + #include "Albany_KokkosTypes.hpp" #include "Albany_Gather.hpp" +#include "Albany_CommUtils.hpp" +#include "Albany_Utils.hpp" #include "Albany_OrdinarySTKFieldContainer.hpp" #include "Albany_MultiSTKFieldContainer.hpp" @@ -21,16 +24,10 @@ #include #endif -#include "Albany_Utils.hpp" #include #include #include -#include -#include -#include -#include - // Expression reading #ifdef ALBANY_PANZER_EXPR_EVAL #include @@ -44,6 +41,11 @@ #include #endif +#include "Teuchos_VerboseObject.hpp" +#include "Teuchos_RCPStdSharedPtrConversions.hpp" + +#include + namespace Albany { @@ -64,7 +66,6 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( } allElementBlocksHaveSamePhysics = true; - compositeTet = params->get("Use Composite Tet 10", false); num_time_deriv = params->get("Number Of Time Derivatives"); requiresAutomaticAura = params->get("Use Automatic Aura", false); @@ -73,8 +74,6 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( meshSpecs.resize(1); fieldAndBulkDataSet = false; - side_maps_present = false; - ignore_side_maps = false; } void GenericSTKMeshStruct::SetupFieldData( @@ -88,8 +87,8 @@ void GenericSTKMeshStruct::SetupFieldData( if (bulkData.is_null()) { - const Teuchos::MpiComm* mpiComm = dynamic_cast* > (comm.get()); - stk::mesh::MeshBuilder meshBuilder = stk::mesh::MeshBuilder(*mpiComm->getRawMpiComm()); + auto mpiComm = getMpiCommFromTeuchosComm(comm); + stk::mesh::MeshBuilder meshBuilder = stk::mesh::MeshBuilder(mpiComm); if(requiresAutomaticAura) meshBuilder.set_aura_option(stk::mesh::BulkData::AUTO_AURA); else @@ -133,10 +132,10 @@ void GenericSTKMeshStruct::SetupFieldData( // Build the usual Albany fields unless the user explicitly specifies the residual or solution vector layout if(user_specified_solution_components && (residual_vector.length() > 0)){ this->fieldContainer = Teuchos::rcp(new MultiSTKFieldContainer(params, - metaData, bulkData, numDim, sis, num_params)); + metaData, bulkData, numDim, num_params)); } else { this->fieldContainer = Teuchos::rcp(new OrdinarySTKFieldContainer(params, - metaData, bulkData, numDim, sis, num_params)); + metaData, bulkData, numDim, num_params)); } // Exodus is only for 2D and 3D. Have 1D version as well @@ -292,20 +291,20 @@ void GenericSTKMeshStruct::setDefaultCoordinates3d () } } -void GenericSTKMeshStruct::rebalanceInitialMeshT(const Teuchos::RCP >& comm){ +void GenericSTKMeshStruct::rebalanceInitialMesh (const Teuchos::RCP& comm){ bool rebalance = params->get("Rebalance Mesh", false); if(rebalance) { TEUCHOS_TEST_FOR_EXCEPTION (this->side_maps_present, std::runtime_error, "Error! Rebalance is not supported when side maps are present.\n"); - rebalanceAdaptedMeshT(params, comm); + rebalanceAdaptedMesh (params, comm); } } void GenericSTKMeshStruct:: -rebalanceAdaptedMeshT(const Teuchos::RCP& params_, - const Teuchos::RCP >& comm) +rebalanceAdaptedMesh (const Teuchos::RCP& params_, + const Teuchos::RCP& comm) { // Zoltan is required here #ifdef ALBANY_ZOLTAN @@ -629,8 +628,8 @@ buildCellSideNodeNumerationMap (const std::string& sideSetName, std::map& sideMap, std::map>& sideNodeMap) { - TEUCHOS_TEST_FOR_EXCEPTION (sideSetMeshStructs.find(sideSetName)==sideSetMeshStructs.end(), Teuchos::Exceptions::InvalidParameter, - "Error in 'buildSideNodeToSideSetCellNodeMap': side set " << sideSetName << " does not have a mesh.\n"); + TEUCHOS_TEST_FOR_EXCEPTION (sideSetMeshStructs.count(sideSetName)==0, Teuchos::Exceptions::InvalidParameter, + "Error in 'buildCellSideNodeNumerationMap': side set " << sideSetName << " does not have a mesh.\n"); Teuchos::RCP side_mesh = sideSetMeshStructs.at(sideSetName); @@ -1532,7 +1531,6 @@ GenericSTKMeshStruct::getValidGenericSTKParameters(std::string listname) const validPL->set("Use Serial Mesh", false, "Read in a single mesh on PE 0 and rebalance"); validPL->set("Transfer Solution to Coordinates", false, "Copies the solution vector to the coordinates for output"); validPL->set("Set All Parts IO", false, "If true, all parts are marked as io parts"); - validPL->set("Use Composite Tet 10", false, "Flag to use the composite tet 10 basis in Intrepid"); validPL->set("Build Node Sets From Side Sets",false,"Flag to build node sets from side sets"); validPL->set("Export 3d coordinates field",false,"If true AND the mesh dimension is not already 3, export a 3d version of the coordinate field."); diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp index d93487471c..a21424b350 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp @@ -19,14 +19,18 @@ class CombineAndScatterManager; class GenericSTKMeshStruct : public AbstractSTKMeshStruct { public: - Teuchos::ArrayRCP >& getMeshSpecs(); - const Teuchos::ArrayRCP >& getMeshSpecs() const; + GenericSTKMeshStruct( + const Teuchos::RCP& params, + const int numDim /*old default: -1*/, const int numParams); - //! Re-load balance adapted mesh - void rebalanceAdaptedMeshT(const Teuchos::RCP& params, - const Teuchos::RCP >& comm); + virtual ~GenericSTKMeshStruct() = default; + + Teuchos::ArrayRCP >& getMeshSpecs(); + const Teuchos::ArrayRCP >& getMeshSpecs() const; - bool useCompositeTet(){ return compositeTet; } + //! Re-load balance adapted mesh + void rebalanceAdaptedMesh (const Teuchos::RCP& params, + const Teuchos::RCP& comm); // This routine builds two maps: side3D_id->cell2D_id, and side3D_node_lid->cell2D_node_lid. // These maps are used because the side id may differ from the cell id and the nodes order @@ -37,17 +41,10 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct std::map>& sideNodeMap); int getNumParams() const {return num_params; } -protected: - GenericSTKMeshStruct( - const Teuchos::RCP& params, - const int numDim /*old default: -1*/, const int numParams); - virtual ~GenericSTKMeshStruct() = default; - - void SetupFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const int worksetSize_); + void SetupFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const int worksetSize_); void printParts(stk::mesh::MetaData *metaData); @@ -58,7 +55,7 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct int computeWorksetSize(const int worksetSizeMax, const int ebSizeMax) const; //! Re-load balance mesh - void rebalanceInitialMeshT(const Teuchos::RCP >& comm); + void rebalanceInitialMesh (const Teuchos::RCP& comm); //! Sets all mesh parts as IO parts (will be written to file) void setAllPartsIO(); @@ -70,40 +67,37 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct void checkNodeSetsFromSideSetsIntegrity (); //! Creates empty mesh structs if required (and not already present) - void initializeSideSetMeshSpecs (const Teuchos::RCP& commT); + void initializeSideSetMeshSpecs (const Teuchos::RCP& comm); //! Creates empty mesh structs if required (and not already present) - void initializeSideSetMeshStructs (const Teuchos::RCP& commT); + void initializeSideSetMeshStructs (const Teuchos::RCP& comm); //! Completes the creation of the side set mesh structs (if of type SideSetSTKMeshStruct) - void setSideSetFieldData( - const Teuchos::RCP& commT, - const std::map >& side_set_sis, - int worksetSize); - - void setSideSetBulkData( - const Teuchos::RCP& commT, - const std::map >& side_set_sis, - int worksetSize); - - void setSideSetFieldAndBulkData( - const Teuchos::RCP& commT, - const std::map >& side_set_sis, - int worksetSize) - { - setSideSetFieldData(commT, side_set_sis, worksetSize); - setSideSetBulkData(commT, side_set_sis, worksetSize); - } + void setSideSetFieldData (const Teuchos::RCP& comm, + const std::map >& side_set_sis, + int worksetSize); + + void setSideSetBulkData (const Teuchos::RCP& comm, + const std::map >& side_set_sis, + int worksetSize); + + void setSideSetFieldAndBulkData (const Teuchos::RCP& comm, + const std::map >& side_set_sis, + int worksetSize) + { + setSideSetFieldData(comm, side_set_sis, worksetSize); + setSideSetBulkData(comm, side_set_sis, worksetSize); + } //! Loads from file input required fields not found in the mesh - void loadRequiredInputFields (const Teuchos::RCP& commT); + void loadRequiredInputFields (const Teuchos::RCP& comm); // Routines to load, fill, or compute a field void loadField (const std::string& field_name, const Teuchos::ParameterList& params, Teuchos::RCP& field_mv, const CombineAndScatterManager& cas_manager, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, bool node, bool scalar, bool layered, const Teuchos::RCP out); void fillField (const std::string& field_name, @@ -152,12 +146,10 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct Teuchos::RCP params; - Teuchos::ArrayRCP > meshSpecs; + Teuchos::ArrayRCP > meshSpecs; bool requiresAutomaticAura; - bool compositeTet; - std::vector m_nodesets_from_sidesets; int num_params; diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp index 1b082ba175..6607b3b6d1 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp @@ -30,10 +30,14 @@ #include "Albany_Utils.hpp" -Albany::GmshSTKMeshStruct::GmshSTKMeshStruct (const Teuchos::RCP& params, - const Teuchos::RCP& commT, - const int numParams) : - GenericSTKMeshStruct (params, -1, numParams) +namespace Albany +{ + +GmshSTKMeshStruct:: +GmshSTKMeshStruct (const Teuchos::RCP& params, + const Teuchos::RCP& comm, + const int numParams) + : GenericSTKMeshStruct (params, -1, numParams) { fname = params->get("Gmsh Input Mesh File Name", "mesh.msh"); @@ -43,7 +47,7 @@ Albany::GmshSTKMeshStruct::GmshSTKMeshStruct (const Teuchos::RCPgetRank() == 0) + if (comm->getRank() == 0) { bool legacy = false; bool binary = false; @@ -51,25 +55,18 @@ Albany::GmshSTKMeshStruct::GmshSTKMeshStruct (const Teuchos::RCP nsNames; std::vector < std::string > ssNames; - set_boundaries( commT, ssNames, nsNames); + set_boundaries( comm, ssNames, nsNames); stk::topology etopology = this->get_topology(); int numEB = 0; - const stk::mesh::PartVector & all_parts = metaData->get_parts(); - for (stk::mesh::PartVector::const_iterator i = all_parts.begin(); - i != all_parts.end(); ++i) { - - stk::mesh::Part * const part = *i ; - + for (auto part : metaData->get_parts()) { if (!stk::mesh::is_auto_declared_part(*part)) { if ( part->primary_entity_rank() == stk::topology::ELEMENT_RANK) { - partVec.push_back(part); numEB++; } @@ -113,8 +104,7 @@ Albany::GmshSTKMeshStruct::GmshSTKMeshStruct (const Teuchos::RCPdeclare_part_with_topology(ebn, etopology)); shards::CellTopology shards_ctd = stk::mesh::get_cell_topology(etopology); @@ -130,18 +120,18 @@ Albany::GmshSTKMeshStruct::GmshSTKMeshStruct (const Teuchos::RCPmeshSpecs[0] = Teuchos::rcp ( - new Albany::MeshSpecsStruct (ctd, numDim, nsNames, ssNames, + new MeshSpecsStruct (ctd, numDim, nsNames, ssNames, worksetSize, partVec[0]->name(), ebNameToIndex)); // Create a mesh specs object for EACH side set - this->initializeSideSetMeshSpecs(commT); + this->initializeSideSetMeshSpecs(comm); // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(commT); + this->initializeSideSetMeshStructs(comm); } -Albany::GmshSTKMeshStruct::~GmshSTKMeshStruct() +GmshSTKMeshStruct::~GmshSTKMeshStruct() { delete[] pts; @@ -198,7 +188,7 @@ Albany::GmshSTKMeshStruct::~GmshSTKMeshStruct() allowable_gmsh_versions.clear(); } -void Albany::GmshSTKMeshStruct::determine_file_type( bool& legacy, bool& binary, bool& ascii) +void GmshSTKMeshStruct::determine_file_type( bool& legacy, bool& binary, bool& ascii) { std::ifstream ifile; open_fname( ifile); @@ -222,10 +212,9 @@ void Albany::GmshSTKMeshStruct::determine_file_type( bool& legacy, bool& binary, } ifile.close(); - return; } -void Albany::GmshSTKMeshStruct::init_counters_to_zero() +void GmshSTKMeshStruct::init_counters_to_zero() { NumSides = 0; NumNodes = 0; @@ -238,11 +227,9 @@ void Albany::GmshSTKMeshStruct::init_counters_to_zero() nb_tri6 = 0; nb_lines = 0; nb_line3 = 0; - - return; } -void Albany::GmshSTKMeshStruct::init_pointers_to_null() +void GmshSTKMeshStruct::init_pointers_to_null() { pts = nullptr; tetra = nullptr; @@ -253,42 +240,38 @@ void Albany::GmshSTKMeshStruct::init_pointers_to_null() quads = nullptr; lines = nullptr; line3 = nullptr; - return; } -void Albany::GmshSTKMeshStruct::broadcast_topology( const Teuchos::RCP& commT) +void GmshSTKMeshStruct::broadcast_topology( const Teuchos::RCP& comm) { - Teuchos::broadcast(*commT, 0, 1, &this->numDim); - Teuchos::broadcast(*commT, 0, 1, &NumElemNodes); - Teuchos::broadcast(*commT, 0, 1, &NumSideNodes); - Teuchos::broadcast(*commT, 0, 1, &NumElems); - Teuchos::broadcast(*commT, 0, 1, &version_in); - - return; + Teuchos::broadcast(*comm, 0, 1, &this->numDim); + Teuchos::broadcast(*comm, 0, 1, &NumElemNodes); + Teuchos::broadcast(*comm, 0, 1, &NumSideNodes); + Teuchos::broadcast(*comm, 0, 1, &NumElems); + Teuchos::broadcast(*comm, 0, 1, &version_in); } -void Albany::GmshSTKMeshStruct::setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void GmshSTKMeshStruct::setFieldData( + const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const std::map >& side_set_sis) { - this->SetupFieldData(commT, sis, worksetSize); - this->setSideSetFieldData(commT, side_set_sis, worksetSize); + this->SetupFieldData (comm, sis, worksetSize); + this->setSideSetFieldData(comm, side_set_sis, worksetSize); } -void Albany::GmshSTKMeshStruct::setBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& /* sis */, +void GmshSTKMeshStruct::setBulkData( + const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, const unsigned int worksetSize, - const std::map >& side_set_sis) + const std::map >& side_set_sis) { metaData->commit(); bulkData->modification_begin(); // Begin modifying the mesh // Only proc 0 has loaded the file - if (commT->getRank()==0) { + if (comm->getRank()==0) { stk::mesh::PartVector singlePartVec(1); unsigned int ebNo = 0; //element block #??? @@ -322,7 +305,7 @@ void Albany::GmshSTKMeshStruct::setBulkData( if(proc_rank_field){ int* p_rank = stk::mesh::field_data(*proc_rank_field, elem); if(p_rank) - p_rank[0] = commT->getRank(); + p_rank[0] = comm->getRank(); } } @@ -375,9 +358,9 @@ void Albany::GmshSTKMeshStruct::setBulkData( params->set("Rebalance Mesh", true); // Rebalance the mesh before starting the simulation if indicated - rebalanceInitialMeshT(commT); + rebalanceInitialMesh (comm); #else - TEUCHOS_TEST_FOR_EXCEPTION(commT->getSize()>1, std::runtime_error, + TEUCHOS_TEST_FOR_EXCEPTION(comm->getSize()>1, std::runtime_error, "Error! If you use a Gmsh mesh, you need to either have ALBANY_ZOLTAN on, or run serially.\n"); #endif @@ -385,15 +368,15 @@ void Albany::GmshSTKMeshStruct::setBulkData( this->setDefaultCoordinates3d(); // Loading required input fields from file - this->loadRequiredInputFields (commT); + this->loadRequiredInputFields (comm); // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(commT, side_set_sis, worksetSize); + this->setSideSetBulkData(comm, side_set_sis, worksetSize); fieldAndBulkDataSet = true; } -Teuchos::RCP Albany::GmshSTKMeshStruct::getValidDiscretizationParameters() const +Teuchos::RCP GmshSTKMeshStruct::getValidDiscretizationParameters() const { Teuchos::RCP validPL = this->getValidGenericSTKParameters("Valid ASCII_DiscParams"); validPL->set("Gmsh Input Mesh File Name", "mesh.msh", @@ -404,7 +387,7 @@ Teuchos::RCP Albany::GmshSTKMeshStruct::getValidDi // -------------------------------- Read methods ---------------------------- // -void Albany::GmshSTKMeshStruct::loadLegacyMesh () +void GmshSTKMeshStruct::loadLegacyMesh () { std::ifstream ifile; open_fname( ifile); @@ -565,16 +548,14 @@ void Albany::GmshSTKMeshStruct::loadLegacyMesh () ifile.close(); } -void Albany::GmshSTKMeshStruct::swallow_lines_until( std::ifstream& ifile, std::string& line, std::string line_of_interest) +void GmshSTKMeshStruct::swallow_lines_until( std::ifstream& ifile, std::string& line, std::string line_of_interest) { while (std::getline (ifile, line) && line != line_of_interest) { // Keep swallowing lines... } - - return; } -void Albany::GmshSTKMeshStruct::set_NumNodes( std::ifstream& ifile) +void GmshSTKMeshStruct::set_NumNodes( std::ifstream& ifile) { std::string line; swallow_lines_until( ifile, line, "$Nodes"); @@ -597,10 +578,9 @@ void Albany::GmshSTKMeshStruct::set_NumNodes( std::ifstream& ifile) } TEUCHOS_TEST_FOR_EXCEPTION (NumNodes<=0, Teuchos::Exceptions::InvalidParameter, "Error! Invalid number of nodes.\n"); - return; } -void Albany::GmshSTKMeshStruct::load_node_data( std::ifstream& ifile) +void GmshSTKMeshStruct::load_node_data( std::ifstream& ifile) { if( version == GmshVersion::V2_2) { @@ -639,11 +619,9 @@ void Albany::GmshSTKMeshStruct::load_node_data( std::ifstream& ifile) delete[] node_IDs; } } - - return; } -void Albany::GmshSTKMeshStruct::set_num_entities( std::ifstream& ifile) +void GmshSTKMeshStruct::set_num_entities( std::ifstream& ifile) { std::string line; ifile.seekg (0, std::ios::beg); @@ -671,11 +649,9 @@ void Albany::GmshSTKMeshStruct::set_num_entities( std::ifstream& ifile) } TEUCHOS_TEST_FOR_EXCEPTION (num_entities<=0, Teuchos::Exceptions::InvalidParameter, "Error! Invalid number of mesh elements.\n"); - - return; } -void Albany::GmshSTKMeshStruct::increment_element_type( int e_type) +void GmshSTKMeshStruct::increment_element_type( int e_type) { switch (e_type) { @@ -692,11 +668,9 @@ void Albany::GmshSTKMeshStruct::increment_element_type( int e_type) TEUCHOS_TEST_FOR_EXCEPTION (true, Teuchos::Exceptions::InvalidParameter, "Error! Element type (" << e_type << ") not supported.\n"); } - - return; } -void Albany::GmshSTKMeshStruct::set_specific_num_of_each_elements( std::ifstream& ifile) +void GmshSTKMeshStruct::set_specific_num_of_each_elements( std::ifstream& ifile) { // Gmsh lists elements and sides (and some points) all together, // and does not specify beforehand what kind of elements @@ -795,11 +769,9 @@ void Albany::GmshSTKMeshStruct::set_specific_num_of_each_elements( std::ifstream "Error! Could not determine if mesh was first or second order.\n" << "Checked for number of 2pt lines and 3pt lines, both are non-zero. \n") } - - return; } -void Albany::GmshSTKMeshStruct::size_all_element_pointers() +void GmshSTKMeshStruct::size_all_element_pointers() { // First values are the node IDs of the element, then tag lines = new int*[3]; @@ -842,14 +814,11 @@ void Albany::GmshSTKMeshStruct::size_all_element_pointers() { line3[i] = new int[nb_line3]; } - - return; } -void Albany::GmshSTKMeshStruct::set_generic_mesh_info() +void GmshSTKMeshStruct::set_generic_mesh_info() { - if (nb_tetra>0) - { + if (nb_tetra>0) { this->numDim = 3; NumElems = nb_tetra; @@ -858,9 +827,7 @@ void Albany::GmshSTKMeshStruct::set_generic_mesh_info() NumSideNodes = 3; elems = tetra; sides = trias; - } - else if (nb_tet10>0) - { + } else if (nb_tet10>0) { this->numDim = 3; NumElems = nb_tet10; @@ -869,9 +836,7 @@ void Albany::GmshSTKMeshStruct::set_generic_mesh_info() NumSideNodes = 6; elems = tet10; sides = tri6; - } - else if (nb_hexas>0) - { + } else if (nb_hexas>0) { this->numDim = 3; NumElems = nb_hexas; @@ -880,9 +845,7 @@ void Albany::GmshSTKMeshStruct::set_generic_mesh_info() NumSideNodes = 4; elems = hexas; sides = quads; - } - else if (nb_trias>0) - { + } else if (nb_trias>0) { this->numDim = 2; NumElems = nb_trias; @@ -891,9 +854,7 @@ void Albany::GmshSTKMeshStruct::set_generic_mesh_info() NumSideNodes = 2; elems = trias; sides = lines; - } - else if (nb_tri6>0) - { + } else if (nb_tri6>0) { this->numDim = 2; NumElems = nb_tri6; @@ -902,9 +863,7 @@ void Albany::GmshSTKMeshStruct::set_generic_mesh_info() NumSideNodes = 3; elems = tri6; sides = line3; - } - else if (nb_quads>0) - { + } else if (nb_quads>0) { this->numDim = 2; NumElems = nb_quads; @@ -913,15 +872,12 @@ void Albany::GmshSTKMeshStruct::set_generic_mesh_info() NumSideNodes = 2; elems = quads; sides = lines; - } - else - { + } else { TEUCHOS_TEST_FOR_EXCEPTION (true, std::runtime_error, "Error! Invalid mesh dimension.\n"); } - return; } -void Albany::GmshSTKMeshStruct::store_element_info( +void GmshSTKMeshStruct::store_element_info( int e_type, int& iline, int& iline3, @@ -987,11 +943,9 @@ void Albany::GmshSTKMeshStruct::store_element_info( default: TEUCHOS_TEST_FOR_EXCEPTION (true, Teuchos::Exceptions::InvalidParameter, "Error! Element type not supported; but you should have got an error before!\n"); } - - return; } -void Albany::GmshSTKMeshStruct::load_element_data( std::ifstream& ifile) +void GmshSTKMeshStruct::load_element_data( std::ifstream& ifile) { // Reset the stream to the beginning of the element section std::string line; @@ -1059,11 +1013,9 @@ void Albany::GmshSTKMeshStruct::load_element_data( std::ifstream& ifile) tags.clear(); } } - - return; } -void Albany::GmshSTKMeshStruct::loadAsciiMesh () +void GmshSTKMeshStruct::loadAsciiMesh () { std::ifstream ifile; open_fname( ifile); @@ -1089,7 +1041,7 @@ void Albany::GmshSTKMeshStruct::loadAsciiMesh () } -void Albany::GmshSTKMeshStruct::loadBinaryMesh () +void GmshSTKMeshStruct::loadBinaryMesh () { std::ifstream ifile; open_fname( ifile); @@ -1346,7 +1298,7 @@ void Albany::GmshSTKMeshStruct::loadBinaryMesh () ifile.close(); } -void Albany::GmshSTKMeshStruct::set_all_nodes_boundary( std::vector& nsNames) +void GmshSTKMeshStruct::set_all_nodes_boundary( std::vector& nsNames) { std::string nsn = "Node"; nsNames.push_back(nsn); @@ -1354,11 +1306,9 @@ void Albany::GmshSTKMeshStruct::set_all_nodes_boundary( std::vector #ifdef ALBANY_SEACAS stk::io::put_io_part_attribute(*nsPartVec[nsn]); #endif - - return; } -void Albany::GmshSTKMeshStruct::set_all_sides_boundary( std::vector& ssNames) +void GmshSTKMeshStruct::set_all_sides_boundary( std::vector& ssNames) { std::string ssn = "BoundarySide"; ssNames.push_back(ssn); @@ -1367,13 +1317,11 @@ void Albany::GmshSTKMeshStruct::set_all_sides_boundary( std::vector stk::io::put_io_part_attribute(*ssPartVec[ssn]); stk::io::put_io_part_attribute(metaData->universal_part()); #endif - - return; } -void Albany::GmshSTKMeshStruct::set_boundaries( const Teuchos::RCP& commT, - std::vector& ssNames, - std::vector& nsNames) +void GmshSTKMeshStruct::set_boundaries (const Teuchos::RCP& comm, + std::vector& ssNames, + std::vector& nsNames) { set_all_nodes_boundary( nsNames); set_all_sides_boundary( ssNames); @@ -1387,14 +1335,14 @@ void Albany::GmshSTKMeshStruct::set_boundaries( const Teuchos::RCP(*commT, 0, 1, &numBdTags); + Teuchos::broadcast(*comm, 0, 1, &numBdTags); int* bdTagsArray = new int[numBdTags]; std::set::iterator it=bdTags.begin(); for (int k=0; it!=bdTags.end(); ++it,++k) { bdTagsArray[k] = *it; } - Teuchos::broadcast(*commT, 0, numBdTags, bdTagsArray); + Teuchos::broadcast(*comm, 0, numBdTags, bdTagsArray); // Adding boundary nodesets and sidesets separating different labels for (int k=0; k physical_surface_names; std::map physical_volume_names; - get_physical_names( physical_surface_names, commT, 2); - get_physical_names( physical_volume_names, commT, 3); + get_physical_names( physical_surface_names, comm, 2); + get_physical_names( physical_volume_names, comm, 3); std::map< std::string, int>::iterator name_it; for( name_it = physical_surface_names.begin(); name_it != physical_surface_names.end(); name_it++) @@ -1437,11 +1385,9 @@ void Albany::GmshSTKMeshStruct::set_boundaries( const Teuchos::RCPget_topology(); metaData->declare_part_with_topology(volume_i.str(), etopology); - - return; } -void Albany::GmshSTKMeshStruct::add_sideset( std::string sideset_name, int tag, std::vector& ssNames) +void GmshSTKMeshStruct::add_sideset( std::string sideset_name, int tag, std::vector& ssNames) { std::stringstream ssn_i; ssn_i << "BoundarySideSet" << sideset_name; @@ -1465,12 +1409,9 @@ void Albany::GmshSTKMeshStruct::add_sideset( std::string sideset_name, int tag, #ifdef ALBANY_SEACAS stk::io::put_io_part_attribute(*ssPartVec[ssn_i.str()]); #endif - - return; } - -void Albany::GmshSTKMeshStruct::add_nodeset( std::string nodeset_name, int tag, std::vector& nsNames) +void GmshSTKMeshStruct::add_nodeset( std::string nodeset_name, int tag, std::vector& nsNames) { std::stringstream nsn_i; nsn_i << "BoundaryNodeSet" << nodeset_name; @@ -1482,11 +1423,9 @@ void Albany::GmshSTKMeshStruct::add_nodeset( std::string nodeset_name, int tag, #ifdef ALBANY_SEACAS stk::io::put_io_part_attribute(*nsPartVec[nsn_i.str()]); #endif - - return; } -stk::topology Albany::GmshSTKMeshStruct::get_topology() +stk::topology GmshSTKMeshStruct::get_topology() { stk::topology etopology; switch (this->numDim) { @@ -1536,15 +1475,13 @@ stk::topology Albany::GmshSTKMeshStruct::get_topology() return etopology; } -void Albany::GmshSTKMeshStruct::set_allowable_gmsh_versions() +void GmshSTKMeshStruct::set_allowable_gmsh_versions() { allowable_gmsh_versions.insert( 2.2); allowable_gmsh_versions.insert( 4.1); - - return; } -bool Albany::GmshSTKMeshStruct::set_version_enum_from_float() +bool GmshSTKMeshStruct::set_version_enum_from_float() { bool can_read = true; if( version_in == (float)2.2 ) @@ -1563,7 +1500,7 @@ bool Albany::GmshSTKMeshStruct::set_version_enum_from_float() return can_read; } -void Albany::GmshSTKMeshStruct::check_version () +void GmshSTKMeshStruct::check_version () { // Tell user what gmsh version we're reading Teuchos::RCP out = Teuchos::fancyOStream(Teuchos::rcpFromRef(std::cout)); @@ -1584,22 +1521,18 @@ void Albany::GmshSTKMeshStruct::check_version () TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "Cannot read this version of gmsh *.msh file!"); } - - return; } -void Albany::GmshSTKMeshStruct::open_fname( std::ifstream& ifile) +void GmshSTKMeshStruct::open_fname( std::ifstream& ifile) { ifile.open(fname.c_str()); if (!ifile.is_open()) { TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error, "Error! Cannot open mesh file '" << fname << "'.\n"); } - - return; } -void Albany::GmshSTKMeshStruct::get_name_for_physical_names( std::string& name, int& id, std::ifstream& ifile, int& dim) +void GmshSTKMeshStruct::get_name_for_physical_names( std::string& name, int& id, std::ifstream& ifile, int& dim) { std::string line; @@ -1619,11 +1552,9 @@ void Albany::GmshSTKMeshStruct::get_name_for_physical_names( std::string& name, name.erase( std::remove(name.begin(), name.end(), '"'), name.end()); name = "_" + name; } - - return; } -void Albany::GmshSTKMeshStruct::get_physical_tag_to_surface_tag_map( +void GmshSTKMeshStruct::get_physical_tag_to_surface_tag_map( std::ifstream& ifile, std::map& physical_surface_tags, int num_surfaces) @@ -1668,11 +1599,9 @@ void Albany::GmshSTKMeshStruct::get_physical_tag_to_surface_tag_map( physical_surface_tags.insert( std::make_pair( physical_tag, surface_tag)); } } - - return; } -void Albany::GmshSTKMeshStruct::get_physical_tag_to_volume_tag_map( +void GmshSTKMeshStruct::get_physical_tag_to_volume_tag_map( std::ifstream& ifile, std::map& physical_volume_tags, int num_volumes) @@ -1717,11 +1646,9 @@ void Albany::GmshSTKMeshStruct::get_physical_tag_to_volume_tag_map( physical_volume_tags.insert( std::make_pair( physical_tag, volume_tag)); } } - - return; } -void Albany::GmshSTKMeshStruct::read_physical_names_from_file( std::map& physical_names, int dim_) +void GmshSTKMeshStruct::read_physical_names_from_file( std::map& physical_names, int dim_) { std::ifstream ifile; open_fname( ifile); @@ -1837,50 +1764,44 @@ void Albany::GmshSTKMeshStruct::read_physical_names_from_file( std::map names, - int* tags_array, - int pair_number, - const Teuchos::RCP& commT, - std::map< std::string, int>& physical_names) +void GmshSTKMeshStruct:: +broadcast_name_tag_pair (std::vector< std::string> names, + int* tags_array, + int pair_number, + const Teuchos::RCP& comm, + std::map< std::string, int>& physical_names) { std::string name; - if( commT->getRank() == 0) - { + if( comm->getRank() == 0) { name = names[pair_number]; int strsize = name.size(); - Teuchos::broadcast( *commT, 0, &strsize); + Teuchos::broadcast( *comm, 0, &strsize); char* ptr = (strsize) ? (&name[0]) : 0; - Teuchos::broadcast( *commT, 0, strsize, ptr); - } - else - { + Teuchos::broadcast( *comm, 0, strsize, ptr); + } else { int strsize; - Teuchos::broadcast( *commT, 0, &strsize); + Teuchos::broadcast( *comm, 0, &strsize); name.resize( strsize); char* ptr = (strsize) ? (&name[0]) : 0; - Teuchos::broadcast( *commT, 0, strsize, ptr); + Teuchos::broadcast( *comm, 0, strsize, ptr); } int tag = tags_array[pair_number]; physical_names.insert( std::make_pair( name, tag)); - - return; } - -void Albany::GmshSTKMeshStruct::broadcast_physical_names( std::map& physical_names, - const Teuchos::RCP& commT) +void GmshSTKMeshStruct:: +broadcast_physical_names (std::map& physical_names, + const Teuchos::RCP& comm) { // Broadcast the number of name-tag pairs int num_pairs = physical_names.size(); - Teuchos::broadcast(*commT, 0, 1, &num_pairs); + Teuchos::broadcast(*comm, 0, 1, &num_pairs); // First unpack the names and tags from the map. // Only proc 0 will be doing anything here. @@ -1901,25 +1822,24 @@ void Albany::GmshSTKMeshStruct::broadcast_physical_names( std::map(*commT, 0, num_pairs, tags_array); + Teuchos::broadcast(*comm, 0, num_pairs, tags_array); for( int i = 0; i < num_pairs; i++) { - broadcast_name_tag_pair( names, tags_array, i, commT, physical_names); + broadcast_name_tag_pair( names, tags_array, i, comm, physical_names); } delete[] tags_array; - return; } -void Albany::GmshSTKMeshStruct::get_physical_names( std::map& physical_names, - const Teuchos::RCP& commT, +void GmshSTKMeshStruct::get_physical_names( std::map& physical_names, + const Teuchos::RCP& comm, int dim) { - if( commT->getRank() == 0 ) + if( comm->getRank() == 0 ) { read_physical_names_from_file( physical_names, dim); } - broadcast_physical_names( physical_names, commT); - - return; + broadcast_physical_names( physical_names, comm); } + +} // Albany diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.hpp b/src/disc/stk/Albany_GmshSTKMeshStruct.hpp index 78349b82a2..7af89c8076 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.hpp @@ -23,20 +23,20 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct public: GmshSTKMeshStruct (const Teuchos::RCP& params, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, const int numParams); ~GmshSTKMeshStruct(); - void setFieldData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } @@ -48,7 +48,7 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct // Set boundary information. // Includes sideset and nodeset names and counts. - void set_boundaries( const Teuchos::RCP& commT, + void set_boundaries( const Teuchos::RCP& comm, std::vector& ssNames, std::vector& nsNames); @@ -73,12 +73,12 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct // Gets the physical name-tag pairs for version 4.1 meshes void get_physical_names( std::map& physical_names, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, int dim); // Share physical_names map with all other processes void broadcast_physical_names( std::map& physical_names, - const Teuchos::RCP& commT); + const Teuchos::RCP& comm); // Read the physical names for Gmsh V 4.1 // to populate the physical_names map @@ -93,7 +93,7 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct void determine_file_type( bool& legacy, bool& binary, bool& ascii); // Broadcast topology of the mesh from 0 to all over procs - void broadcast_topology( const Teuchos::RCP& commT); + void broadcast_topology( const Teuchos::RCP& comm); // Sets NumNodes for ascii msh files void set_NumNodes( std::ifstream& ifile); @@ -144,7 +144,7 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct void broadcast_name_tag_pair( std::vector< std::string> names, int* tags_array, int pair_number, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, std::map< std::string, int>& physical_names); // Reads a single physical name from ifile. diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index c74d3b3995..3f734a4a0d 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -8,8 +8,10 @@ #ifdef ALBANY_SEACAS -#include +#include "Albany_Utils.hpp" +#include "Albany_CommUtils.hpp" +#include #include "Teuchos_VerboseObject.hpp" #include @@ -24,9 +26,8 @@ #include -#include "Albany_Utils.hpp" +#include -#include namespace { @@ -45,33 +46,35 @@ void get_element_block_sizes(stk::io::StkMeshIoBroker &mesh_data, } // Anonymous namespace -Albany::IossSTKMeshStruct::IossSTKMeshStruct( - const Teuchos::RCP& params_, - const Teuchos::RCP& commT, - const int numParams_) : - GenericSTKMeshStruct(params_, -1, numParams_), - out(Teuchos::VerboseObjectBase::getDefaultOStream()), - useSerialMesh(false), - periodic(params->get("Periodic BC", false)), - m_hasRestartSolution(false), - m_restartDataTime(-1.0), - m_solutionFieldHistoryDepth(0) +namespace Albany +{ + +IossSTKMeshStruct:: +IossSTKMeshStruct(const Teuchos::RCP& params_, + const Teuchos::RCP& comm, + const int numParams_) + : GenericSTKMeshStruct(params_, -1, numParams_) + , out(Teuchos::VerboseObjectBase::getDefaultOStream()) + , useSerialMesh(false) + , periodic(params->get("Periodic BC", false)) + , m_hasRestartSolution(false) + , m_restartDataTime(-1.0) + , m_solutionFieldHistoryDepth(0) { params->validateParameters(*getValidDiscretizationParameters(),0); usePamgen = (params->get("Method","Exodus") == "Pamgen"); - std::vector entity_rank_names = stk::mesh::entity_rank_names(); - const Teuchos::MpiComm* theComm = dynamic_cast* > (commT.get()); + auto mpiComm = getMpiCommFromTeuchosComm(comm); - mesh_data = Teuchos::rcp(new stk::io::StkMeshIoBroker(*theComm->getRawMpiComm())); + mesh_data = Teuchos::rcp(new stk::io::StkMeshIoBroker(mpiComm)); // Use Greg Sjaardema's capability to repartition on the fly. // Several partitioning choices: rcb, rib, hsfc, kway, kway-gemo, linear, random // linear does not require Zoltan or metis - if (params->get("Use Serial Mesh", false) && commT->getSize() > 1){ + if (params->get("Use Serial Mesh", false) && comm->getSize() > 1){ // Option external reads the nemesis files, and must be the default #ifdef ALBANY_ZOLTAN mesh_data->property_add(Ioss::Property("DECOMPOSITION_METHOD", "rib")); @@ -111,8 +114,8 @@ Albany::IossSTKMeshStruct::IossSTKMeshStruct( typedef Teuchos::Array StringArray; const StringArray additionalNodeSets = params->get("Additional Node Sets", StringArray()); - for (StringArray::const_iterator it = additionalNodeSets.begin(), it_end = additionalNodeSets.end(); it != it_end; ++it) { - stk::mesh::Part &newNodeSet = metaData->declare_part(*it, stk::topology::NODE_RANK); + for (const auto& nsn : additionalNodeSets) { + stk::mesh::Part &newNodeSet = metaData->declare_part(nsn, stk::topology::NODE_RANK); if (!stk::io::is_part_io_part(newNodeSet)) { stk::mesh::Field * const distrFactorfield = metaData->get_field(stk::topology::NODE_RANK, "distribution_factors"); if (distrFactorfield != NULL){ @@ -132,11 +135,7 @@ Albany::IossSTKMeshStruct::IossSTKMeshStruct( std::vector nsNames; int numEB = 0; - for (stk::mesh::PartVector::const_iterator i = all_parts.begin(); - i != all_parts.end(); ++i) { - - stk::mesh::Part * const part = *i ; - + for (const auto& part : all_parts) { if (!stk::mesh::is_auto_declared_part(*part)) { if ( part->primary_entity_rank() == stk::topology::ELEMENT_RANK) { @@ -177,19 +176,6 @@ Albany::IossSTKMeshStruct::IossSTKMeshStruct( cullSubsetParts(ssNames, ssPartVec); // Eliminate sidesets that are subsets of other sidesets -#if 0 - // for debugging, print out the parts now - std::map::iterator it; - - for(it = ssPartVec.begin(); it != ssPartVec.end(); ++it){ // loop over the parts in the map - - // for each part in turn, get the name of parts that are a subset of it - - print(*out, "Found \n", *it->second); - } - // end debugging -#endif - int worksetSizeMax = params->get("Workset Size", -1); // Get number of elements per element block using Ioss for use @@ -212,7 +198,7 @@ Albany::IossSTKMeshStruct::IossSTKMeshStruct( // Construct MeshSpecsStruct { const CellTopologyData& ctd = *elementBlockTopologies_[0].getCellTopologyData(); - this->meshSpecs[0] = Teuchos::rcp(new Albany::MeshSpecsStruct( + this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct( ctd, numDim, nsNames, ssNames, worksetSize, partVec[0]->name(), ebNameToIndex)); } @@ -233,7 +219,7 @@ Albany::IossSTKMeshStruct::IossSTKMeshStruct( this->setAllPartsIO(); // Create a mesh specs object for EACH side set - this->initializeSideSetMeshSpecs(commT); + this->initializeSideSetMeshSpecs(comm); // Get upper bound on sideset workset sizes by using Ioss element counts on side blocks if (worksetSize == ebSizeMax) { @@ -273,10 +259,10 @@ Albany::IossSTKMeshStruct::IossSTKMeshStruct( } // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(commT); + this->initializeSideSetMeshStructs(comm); } -Albany::IossSTKMeshStruct::~IossSTKMeshStruct() +IossSTKMeshStruct::~IossSTKMeshStruct() { // Explicitly delete these in exactly this order. There are three // reasons. First, StkMeshIoBroker does not have a MetaData getter that @@ -295,14 +281,13 @@ Albany::IossSTKMeshStruct::~IossSTKMeshStruct() mesh_data = Teuchos::null; } -void -Albany::IossSTKMeshStruct::setFieldData ( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void IossSTKMeshStruct:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis) { - this->SetupFieldData(commT, sis, worksetSize); + this->SetupFieldData(comm, sis, worksetSize); if(mesh_data->is_bulk_data_null()) mesh_data->set_bulk_data(*bulkData); @@ -328,7 +313,7 @@ Albany::IossSTKMeshStruct::setFieldData ( // trick to avoid hanging - if(commT->getRank() == 0){ // read in the mesh on PE 0 + if(comm->getRank() == 0){ // read in the mesh on PE 0 mesh_data->populate_bulk_data(); if (this->numDim!=3) @@ -454,10 +439,8 @@ Albany::IossSTKMeshStruct::setFieldData ( } } else { // We put all the fields as 'missing' - const stk::mesh::FieldVector& fields = metaData->get_fields(); - for (decltype(fields.size()) i=0; iname()); - missing.push_back(stk::io::MeshField(fields[i],fields[i]->name())); + for (const auto& f : metaData->get_fields()) { + missing.emplace_back(f,f->name()); } } @@ -478,28 +461,27 @@ Albany::IossSTKMeshStruct::setFieldData ( // Only proc 0 actually read the mesh, and can confirm whether or not the side maps were present // Unfortunately, Teuchos does not have a specialization for type bool when it comes to communicators, so we need ints int bool_to_int = side_maps_present ? 1 : 0; - Teuchos::broadcast(*commT,0,1,&bool_to_int); + Teuchos::broadcast(*comm,0,1,&bool_to_int); side_maps_present = bool_to_int == 1 ? true : false; } // Loading required input fields from file - //this->loadRequiredInputFields (commT); + //this->loadRequiredInputFields (comm); // Rebalance the mesh before starting the simulation if indicated - rebalanceInitialMeshT(commT); + rebalanceInitialMesh (comm); // Check that the nodeset created from sidesets contain the right number of nodes this->checkNodeSetsFromSideSetsIntegrity (); - this->setSideSetFieldData(commT, side_set_sis, worksetSize); + this->setSideSetFieldData(comm, side_set_sis); } -void -Albany::IossSTKMeshStruct::setBulkData ( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void IossSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis) { mesh_data->add_all_mesh_fields_as_input_fields(); // KL: this adds "solution field" std::vector missing; @@ -524,7 +506,7 @@ Albany::IossSTKMeshStruct::setBulkData ( // trick to avoid hanging bulkData->modification_begin(); - if(commT->getRank() == 0){ // read in the mesh on PE 0 + if(comm->getRank() == 0){ // read in the mesh on PE 0 //stk::io::process_mesh_bulk_data(region, *bulkData); @@ -749,27 +731,27 @@ Albany::IossSTKMeshStruct::setBulkData ( // Only proc 0 actually read the mesh, and can confirm whether or not the side maps were present // Unfortunately, Teuchos does not have a specialization for type bool when it comes to communicators, so we need ints int bool_to_int = side_maps_present ? 1 : 0; - Teuchos::broadcast(*commT,0,1,&bool_to_int); + Teuchos::broadcast(*comm,0,1,&bool_to_int); side_maps_present = bool_to_int == 1 ? true : false; } // Loading required input fields from file - this->loadRequiredInputFields (commT); + this->loadRequiredInputFields (comm); // Rebalance the mesh before starting the simulation if indicated - rebalanceInitialMeshT(commT); + rebalanceInitialMesh(comm); // Check that the nodeset created from sidesets contain the right number of nodes this->checkNodeSetsFromSideSetsIntegrity (); // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(commT, side_set_sis, worksetSize); + this->setSideSetBulkData(comm, side_set_sis); fieldAndBulkDataSet = true; } double -Albany::IossSTKMeshStruct::getSolutionFieldHistoryStamp(int step) const +IossSTKMeshStruct::getSolutionFieldHistoryStamp(int step) const { TEUCHOS_ASSERT(step >= 0 && step < m_solutionFieldHistoryDepth); @@ -779,7 +761,7 @@ Albany::IossSTKMeshStruct::getSolutionFieldHistoryStamp(int step) const } void -Albany::IossSTKMeshStruct::loadOrSetCoordinates3d(int index) +IossSTKMeshStruct::loadOrSetCoordinates3d(int index) { const std::string coords3d_name = "coordinates3d"; @@ -834,7 +816,7 @@ Albany::IossSTKMeshStruct::loadOrSetCoordinates3d(int index) void -Albany::IossSTKMeshStruct::loadSolutionFieldHistory(int step) +IossSTKMeshStruct::loadSolutionFieldHistory(int step) { TEUCHOS_ASSERT(step >= 0 && step < m_solutionFieldHistoryDepth); @@ -843,7 +825,7 @@ Albany::IossSTKMeshStruct::loadSolutionFieldHistory(int step) } Teuchos::RCP -Albany::IossSTKMeshStruct::getValidDiscretizationParameters() const +IossSTKMeshStruct::getValidDiscretizationParameters() const { Teuchos::RCP validPL = this->getValidGenericSTKParameters("Valid IOSS_DiscParams"); @@ -861,4 +843,6 @@ Albany::IossSTKMeshStruct::getValidDiscretizationParameters() const return validPL; } +} // namespace Albany + #endif // ALBANY_SEACAS diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.hpp b/src/disc/stk/Albany_IossSTKMeshStruct.hpp index 414debaa05..06dbbe3e04 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.hpp @@ -28,15 +28,15 @@ namespace Albany { ~IossSTKMeshStruct(); - void setFieldData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); int getSolutionFieldHistoryDepth() const {return m_solutionFieldHistoryDepth;} double getSolutionFieldHistoryStamp(int step) const; diff --git a/src/disc/stk/Albany_MultiSTKFieldContainer.cpp b/src/disc/stk/Albany_MultiSTKFieldContainer.cpp index 02d3d8f81e..25bf11eb0a 100644 --- a/src/disc/stk/Albany_MultiSTKFieldContainer.cpp +++ b/src/disc/stk/Albany_MultiSTKFieldContainer.cpp @@ -40,7 +40,6 @@ MultiSTKFieldContainer::MultiSTKFieldContainer( const Teuchos::RCP& metaData_, const Teuchos::RCP& bulkData_, const int numDim_, - const Teuchos::RCP& sis, const int num_params_) : GenericSTKFieldContainer( params_, @@ -80,8 +79,6 @@ MultiSTKFieldContainer::MultiSTKFieldContainer( #endif } - this->addStateStructs(sis); - initializeProcRankField(); } @@ -207,34 +204,7 @@ MultiSTKFieldContainer::MultiSTKFieldContainer( } } - // Do the coordinates - this->coordinates_field = - &metaData_->declare_field(stk::topology::NODE_RANK, "coordinates"); - stk::mesh::put_field_on_mesh( - *this->coordinates_field, metaData_->universal_part(), numDim_, nullptr); -#ifdef ALBANY_SEACAS - stk::io::set_field_role(*this->coordinates_field, Ioss::Field::MESH); -#endif - - if (numDim_ == 3) { - this->coordinates_field3d = this->coordinates_field; - } else { - this->coordinates_field3d = &metaData_->declare_field( - stk::topology::NODE_RANK, "coordinates3d"); - stk::mesh::put_field_on_mesh( - *this->coordinates_field3d, metaData_->universal_part(), 3, nullptr); -#ifdef ALBANY_SEACAS - if (params_->get("Export 3d coordinates field", false)) { - stk::io::set_field_role( - *this->coordinates_field3d, Ioss::Field::TRANSIENT); - } -#endif - } - this->addStateStructs(sis); - - //initializeProcRankField(); - } void MultiSTKFieldContainer:: diff --git a/src/disc/stk/Albany_MultiSTKFieldContainer.hpp b/src/disc/stk/Albany_MultiSTKFieldContainer.hpp index 1a3f3adc8a..63591ecc16 100644 --- a/src/disc/stk/Albany_MultiSTKFieldContainer.hpp +++ b/src/disc/stk/Albany_MultiSTKFieldContainer.hpp @@ -20,7 +20,6 @@ class MultiSTKFieldContainer : public GenericSTKFieldContainer const Teuchos::RCP& metaData_, const Teuchos::RCP& bulkData_, const int numDim_, - const Teuchos::RCP& sis, const int num_params); MultiSTKFieldContainer( diff --git a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp index df36e3aafe..608e4b597c 100644 --- a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp +++ b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp @@ -45,7 +45,6 @@ OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( const Teuchos::RCP& metaData_, const Teuchos::RCP& bulkData_, const int numDim_, - const Teuchos::RCP& sis, const int num_params_) : GenericSTKFieldContainer( params_, @@ -88,10 +87,7 @@ OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( #endif } - this->addStateStructs(sis); - initializeProcRankField(); - } OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( @@ -117,10 +113,9 @@ OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( #endif //IKT FIXME? - currently won't write dxdp to output file if problem is steady, //as this output doesn't work in same way. May want to change in the future. - bool output_sens_field = false; const auto& sens_method = params_->get("Sensitivity Method","NONE"); - if (this->num_params > 0 && num_time_deriv > 0 && sens_method != "None") output_sens_field = true; + output_sens_field = this->num_params > 0 && num_time_deriv > 0 && sens_method != "None"; //Create tag and id arrays for sensitivity field (dxdp or dgdp) std::vector sol_sens_tag_name_vec; @@ -203,9 +198,6 @@ OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( } this->addStateStructs(sis); - - //initializeProcRankField(); - } void @@ -272,7 +264,7 @@ saveSolnVector (const Thyra_Vector& soln, { saveVectorImpl (soln, solution_field[0]->name(), sol_dof_mgr, overlapped); - if (soln_dxdp != Teuchos::null) { + if (soln_dxdp != Teuchos::null and output_sens_field) { TEUCHOS_TEST_FOR_EXCEPTION( soln_dxdp->domain()->dim() != this->num_params, std::runtime_error, "Error in saveSolnVector! Wrong number of vectors in soln_dxdp.\n" @@ -318,7 +310,7 @@ saveSolnMultiVector (const Thyra_MultiVector& soln, saveVectorImpl (*soln.col(icomp), solution_field[icomp]->name(), sol_dof_mgr, overlapped); } - if (soln_dxdp != Teuchos::null) { + if (soln_dxdp != Teuchos::null and output_sens_field) { TEUCHOS_TEST_FOR_EXCEPTION( soln_dxdp->domain()->dim() != this->num_params, std::runtime_error, "Error in saveSolnVector! Wrong number of vectors in soln_dxdp.\n" diff --git a/src/disc/stk/Albany_OrdinarySTKFieldContainer.hpp b/src/disc/stk/Albany_OrdinarySTKFieldContainer.hpp index d9a32f8bb6..5db1ae9d3c 100644 --- a/src/disc/stk/Albany_OrdinarySTKFieldContainer.hpp +++ b/src/disc/stk/Albany_OrdinarySTKFieldContainer.hpp @@ -19,7 +19,6 @@ class OrdinarySTKFieldContainer : public GenericSTKFieldContainer const Teuchos::RCP& metaData_, const Teuchos::RCP& bulkData_, const int numDim_, - const Teuchos::RCP& sis, const int num_params); OrdinarySTKFieldContainer( @@ -132,6 +131,8 @@ class OrdinarySTKFieldContainer : public GenericSTKFieldContainer Teuchos::Array solution_field_dxdp; AbstractSTKFieldContainer::STKFieldType* residual_field; + + bool output_sens_field = false; }; } // namespace Albany diff --git a/src/disc/stk/Albany_STK3DPointStruct.cpp b/src/disc/stk/Albany_STK3DPointStruct.cpp index fd814c2631..cb5c11958c 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.cpp +++ b/src/disc/stk/Albany_STK3DPointStruct.cpp @@ -13,10 +13,11 @@ namespace Albany { //Constructor for meshes read from ASCII file -STK3DPointStruct::STK3DPointStruct(const Teuchos::RCP& params, - const Teuchos::RCP& commT, - const int numParams) : - GenericSTKMeshStruct(params, 3, numParams) +STK3DPointStruct:: +STK3DPointStruct(const Teuchos::RCP& params, + const Teuchos::RCP& comm, + const int numParams) + : GenericSTKMeshStruct(params, 3, numParams) { std::cout << "---3DPoint constructor---" << std::endl; partVec.push_back(&metaData->declare_part_with_topology("Block0", stk::topology::PARTICLE)); @@ -43,37 +44,33 @@ STK3DPointStruct::STK3DPointStruct(const Teuchos::RCP& p std::cout << "---3DPoint constructor done---" << std::endl; // Create a mesh specs object for EACH side set - this->initializeSideSetMeshSpecs(commT); + this->initializeSideSetMeshSpecs(comm); // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(commT); + this->initializeSideSetMeshStructs(comm); } -STK3DPointStruct::~STK3DPointStruct() {}; - -void -STK3DPointStruct::setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void STK3DPointStruct:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis) { std::cout << "---3DPoint::setFieldData---" << std::endl; - SetupFieldData(commT, sis, worksetSize); - this->setSideSetFieldData(commT, side_set_sis, worksetSize); + SetupFieldData(comm, sis, worksetSize); + this->setSideSetFieldData(comm, side_set_sis, worksetSize); } -void -STK3DPointStruct::setBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void STK3DPointStruct:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, + const unsigned int worksetSize, + const std::map >& side_set_sis) { std::cout << "---3DPoint::setBulkData---" << std::endl; metaData->commit(); bulkData->modification_begin(); // Begin modifying the mesh - //TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::buildMesh(commT); + //TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::buildMesh(comm); stk::mesh::PartVector nodePartVec; stk::mesh::PartVector singlePartVec(1); singlePartVec[0] = partVec[0]; // Get the element block part to put the element in. @@ -88,11 +85,11 @@ STK3DPointStruct::setBulkData( bulkData->modification_end(); fieldAndBulkDataSet = true; - this->setSideSetBulkData(commT, side_set_sis, worksetSize); + this->setSideSetBulkData(comm, side_set_sis, worksetSize); } void -STK3DPointStruct::buildMesh(const Teuchos::RCP& /* commT */) +STK3DPointStruct::buildMesh(const Teuchos::RCP& /* comm */) { std::cout << "---3DPoint::buildMesh---" << std::endl; } diff --git a/src/disc/stk/Albany_STK3DPointStruct.hpp b/src/disc/stk/Albany_STK3DPointStruct.hpp index 9c10a85803..617ba28e1d 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.hpp +++ b/src/disc/stk/Albany_STK3DPointStruct.hpp @@ -22,21 +22,21 @@ namespace Albany { //! Default constructor STK3DPointStruct(const Teuchos::RCP& params, - const Teuchos::RCP& commT, - const int numParams); + const Teuchos::RCP& comm, + const int numParams); - ~STK3DPointStruct(); + ~STK3DPointStruct() = default; //! Sets mesh generation parameters - void setFieldData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } @@ -47,7 +47,7 @@ namespace Albany { private: //! Build the mesh - void buildMesh(const Teuchos::RCP& commT); + void buildMesh(const Teuchos::RCP& comm); //! Build a parameter list that contains valid input parameters Teuchos::RCP diff --git a/src/disc/stk/Albany_STKDiscretization.cpp b/src/disc/stk/Albany_STKDiscretization.cpp index ae0626a522..b9e92d4b6a 100644 --- a/src/disc/stk/Albany_STKDiscretization.cpp +++ b/src/disc/stk/Albany_STKDiscretization.cpp @@ -8,7 +8,6 @@ #include #include -#include "Albany_BucketArray.hpp" #include "Albany_Macros.hpp" #include "Albany_NodalGraphUtils.hpp" #include "Albany_STKDiscretization.hpp" @@ -1333,10 +1332,6 @@ STKDiscretization::computeWorksetInfo() // Clear map if remeshing if (!elemGIDws.empty()) { elemGIDws.clear(); } - typedef stk::mesh::Cartesian NodeTag; - typedef stk::mesh::Cartesian ElemTag; - typedef stk::mesh::Cartesian CompTag; - for (int b = 0; b < numBuckets; b++) { stk::mesh::Bucket& buck = *buckets[b]; m_ws_elem_coords[b].resize(buck.size()); diff --git a/src/disc/stk/Albany_STKNodeFieldContainer.hpp b/src/disc/stk/Albany_STKNodeFieldContainer.hpp index 67b63ce54a..b120573d4c 100644 --- a/src/disc/stk/Albany_STKNodeFieldContainer.hpp +++ b/src/disc/stk/Albany_STKNodeFieldContainer.hpp @@ -8,7 +8,6 @@ #define ALBANY_STK_NODE_FIELD_CONTAINER_HPP #include "Albany_AbstractNodeFieldContainer.hpp" -#include "Albany_BucketArray.hpp" #include "Albany_ThyraUtils.hpp" #include "Albany_GlobalLocalIndexer.hpp" #include "Albany_StateInfoStruct.hpp" // For StateView diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp index ff3393951b..8dc1381900 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp @@ -7,6 +7,7 @@ #include #include "Albany_SideSetSTKMeshStruct.hpp" +#include "Albany_CommUtils.hpp" #include "Teuchos_RCPStdSharedPtrConversions.hpp" @@ -27,10 +28,11 @@ namespace Albany { -SideSetSTKMeshStruct::SideSetSTKMeshStruct (const MeshSpecsStruct& inputMeshSpecs, - const Teuchos::RCP& params, - const Teuchos::RCP& commT, - const int numParams) : +SideSetSTKMeshStruct:: +SideSetSTKMeshStruct (const MeshSpecsStruct& inputMeshSpecs, + const Teuchos::RCP& params, + const Teuchos::RCP& comm, + const int numParams) : GenericSTKMeshStruct(params, -1, numParams) { @@ -103,8 +105,8 @@ SideSetSTKMeshStruct::SideSetSTKMeshStruct (const MeshSpecsStruct& inputMeshSpec this->meshSpecs[0] = Teuchos::rcp(new Albany::MeshSpecsStruct(ctd, this->numDim, nsNames, ssNames, worksetSize, ebn, ebNameToIndex)); - const Teuchos::MpiComm* mpiComm = dynamic_cast* > (commT.get()); - stk::mesh::MeshBuilder meshBuilder = stk::mesh::MeshBuilder(*mpiComm->getRawMpiComm()); + auto mpiComm = getMpiCommFromTeuchosComm(comm); + stk::mesh::MeshBuilder meshBuilder = stk::mesh::MeshBuilder(mpiComm); meshBuilder.set_aura_option(stk::mesh::BulkData::NO_AUTO_AURA); meshBuilder.set_bucket_capacity(worksetSize); meshBuilder.set_add_fmwk_data(false); @@ -112,35 +114,32 @@ SideSetSTKMeshStruct::SideSetSTKMeshStruct (const MeshSpecsStruct& inputMeshSpec bulkData = Teuchos::rcp(bulkDataPtr.release()); } -SideSetSTKMeshStruct::~SideSetSTKMeshStruct() -{ - // Nothing to be done here -} - -void SideSetSTKMeshStruct::setParentMeshInfo (const AbstractSTKMeshStruct& parentMeshStruct_, - const std::string& sideSetName) +void SideSetSTKMeshStruct:: +setParentMeshInfo (const AbstractSTKMeshStruct& parentMeshStruct_, + const std::string& sideSetName) { parentMeshStruct = Teuchos::rcpFromRef(parentMeshStruct_); parentMeshSideSetName = sideSetName; } -void SideSetSTKMeshStruct::setFieldData ( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& /*side_set_sis*/) +void SideSetSTKMeshStruct:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& /*side_set_sis*/) { - this->SetupFieldData(commT, sis, worksetSize); + this->SetupFieldData(comm, sis, worksetSize); } -void SideSetSTKMeshStruct::setBulkData ( - const Teuchos::RCP& commT, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /*side_set_sis*/) +void SideSetSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, + const unsigned int /* worksetSize */, + const std::map >& /*side_set_sis*/) { - TEUCHOS_TEST_FOR_EXCEPTION (parentMeshStruct->ssPartVec.find(parentMeshSideSetName)==parentMeshStruct->ssPartVec.end(), std::logic_error, - "Error! The side set " << parentMeshSideSetName << " is not present in the input mesh.\n"); + TEUCHOS_TEST_FOR_EXCEPTION ( + parentMeshStruct->ssPartVec.count(parentMeshSideSetName)==0, std::logic_error, + "Error! The side set " << parentMeshSideSetName << " is not present in the input mesh.\n"); // Extracting the side part and updating the selector const stk::mesh::Part& ss_part = *parentMeshStruct->ssPartVec.find(parentMeshSideSetName)->second; @@ -149,11 +148,10 @@ void SideSetSTKMeshStruct::setBulkData ( const stk::mesh::MetaData& inputMetaData = *parentMeshStruct->metaData; const stk::mesh::BulkData& inputBulkData = *parentMeshStruct->bulkData; - typedef AbstractSTKFieldContainer::STKFieldType STKFieldType; - const STKFieldType& parent_coordinates_field = *parentMeshStruct->getCoordinatesField(); - const STKFieldType& parent_coordinates_field3d = *parentMeshStruct->getCoordinatesField3d(); - STKFieldType& coordinates_field = *fieldContainer->getCoordinatesField(); - STKFieldType& coordinates_field3d = *fieldContainer->getCoordinatesField3d(); + const auto& parent_coordinates_field = *parentMeshStruct->getCoordinatesField(); + const auto& parent_coordinates_field3d = *parentMeshStruct->getCoordinatesField3d(); + auto& coordinates_field = *fieldContainer->getCoordinatesField(); + auto& coordinates_field3d = *fieldContainer->getCoordinatesField3d(); // Now we can extract the entities std::vector sides, nodes; @@ -212,7 +210,7 @@ void SideSetSTKMeshStruct::setBulkData ( } // Loading the fields from file - this->loadRequiredInputFields (commT); + this->loadRequiredInputFields (comm); // Insertion of entities end bulkData->modification_end(); diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp index 57fa9cdc7f..b45d9463b7 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp @@ -21,7 +21,7 @@ class SideSetSTKMeshStruct : public GenericSTKMeshStruct const Teuchos::RCP& commT, const int numParams); - virtual ~SideSetSTKMeshStruct(); + virtual ~SideSetSTKMeshStruct() = default; void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp index bc0e4fd727..e26cd34edd 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp @@ -89,18 +89,18 @@ class TmplSTKMeshStruct : public GenericSTKMeshStruct { TmplSTKMeshStruct(const Teuchos::RCP& params, const Teuchos::RCP& commT, const int numParams); - ~TmplSTKMeshStruct() {}; + ~TmplSTKMeshStruct() = default; //! Sets mesh generation parameters - void setFieldData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& commT, - const Teuchos::RCP& sis, + void setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + const std::map >& side_set_sis = {}); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } @@ -183,17 +183,19 @@ template<> void TmplSTKMeshStruct<1>::buildMesh(const Teuchos::RCP void TmplSTKMeshStruct<2>::buildMesh(const Teuchos::RCP& commT); template<> void TmplSTKMeshStruct<3>::buildMesh(const Teuchos::RCP& commT); -template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis); - -template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis); +template<> +void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis); + +template<> +void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis); template<> Teuchos::RCP TmplSTKMeshStruct<0>::getValidDiscretizationParameters() const; template<> Teuchos::RCP TmplSTKMeshStruct<1>::getValidDiscretizationParameters() const; diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp index e63f08f807..140d22028d 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp @@ -33,7 +33,7 @@ namespace Albany { template TmplSTKMeshStruct::TmplSTKMeshStruct( const Teuchos::RCP& params, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, const int numParams) : GenericSTKMeshStruct(params, traits_type::size, numParams), periodic_x(params->get("Periodic_x BC", false)), @@ -129,7 +129,7 @@ TmplSTKMeshStruct::TmplSTKMeshStruct( // Format and print out information about the mesh that is being generated if constexpr (Dim>0) // Avoid warning for pointless comparison in for loop - if (commT->getRank()==0){ // Not reached for 0D problems + if (comm->getRank()==0){ // Not reached for 0D problems std::cout <<"TmplSTKMeshStruct:: Creating " << Dim << "D mesh of size "; @@ -265,7 +265,7 @@ TmplSTKMeshStruct::TmplSTKMeshStruct( // so that the problem setup can know the worksetSize // Distribute the elems equally. Build total_elems elements, with nodeIDs starting at StartIndex - elem_map = Teuchos::rcp(new Tpetra_Map(total_elems, StartIndex, commT, Tpetra::GloballyDistributed)); + elem_map = Teuchos::rcp(new Tpetra_Map(total_elems, StartIndex, comm, Tpetra::GloballyDistributed)); int worksetSize = this->computeWorksetSize(worksetSizeMax, elem_map->getLocalNumElements() * (triangles ? 2 : 1)); @@ -293,19 +293,19 @@ TmplSTKMeshStruct::TmplSTKMeshStruct( } // Create a mesh specs object for EACH side set - this->initializeSideSetMeshSpecs(commT); + this->initializeSideSetMeshSpecs(comm); // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(commT); + this->initializeSideSetMeshStructs(comm); } template void -TmplSTKMeshStruct::setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +TmplSTKMeshStruct:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& side_set_sis) { // Create global mesh: Dim-D structured, rectangular std::vector h_dim[traits_type::size]; @@ -325,39 +325,36 @@ TmplSTKMeshStruct::setFieldData( x[idx][i] = x[idx][i - 1] + h_dim[idx][i - 1]; // place the coordinates of the element nodes } - SetupFieldData(commT, sis, worksetSize); - this->setSideSetFieldData(commT, side_set_sis, worksetSize); + SetupFieldData(comm, sis, worksetSize); + this->setSideSetFieldData(comm, side_set_sis, worksetSize); } template -void -TmplSTKMeshStruct::setBulkData( - const Teuchos::RCP& commT, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void TmplSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm, + const Teuchos::RCP& /* sis */, + const unsigned int worksetSize, + const std::map >& side_set_sis) { metaData->commit(); - // STK bulkData->modification_begin(); // Begin modifying the mesh - buildMesh(commT); + buildMesh(comm); - // STK fix_node_sharing(*bulkData); bulkData->modification_end(); this->setDefaultCoordinates3d(); - this->loadRequiredInputFields (commT); + this->loadRequiredInputFields (comm); // Rebalance the mesh before starting the simulation if indicated - rebalanceInitialMeshT(commT); + rebalanceInitialMesh(comm); fieldAndBulkDataSet = true; // Finally, setup the side set meshes (if any) - this->setSideSetBulkData(commT, side_set_sis, worksetSize); + this->setSideSetBulkData(comm, side_set_sis, worksetSize); } template @@ -419,6 +416,8 @@ EBSpecsStruct<0>::numElems(int /* i */){ template<> void EBSpecsStruct<0>::calcElemSizes(std::vector h[]){ + // For Dim=0, the elem sizes vector was not sized yet + h[0].resize(1); h[0][0] = 1.0; } @@ -518,7 +517,7 @@ EBSpecsStruct<3>::Initialize(int i, const Teuchos::RCP& // Specializations to build the mesh for each dimension template<> void -TmplSTKMeshStruct<0>::buildMesh(const Teuchos::RCP& /* commT */) +TmplSTKMeshStruct<0>::buildMesh(const Teuchos::RCP& /* comm */) { stk::mesh::PartVector nodePartVec; stk::mesh::PartVector singlePartVec(1); @@ -541,19 +540,19 @@ TmplSTKMeshStruct<0>::buildMesh(const Teuchos::RCP& /* commT template<> void -TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setFieldData( - const Teuchos::RCP& commT, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& /*side_set_sis*/) +TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const unsigned int worksetSize, + const std::map >& /*side_set_sis*/) { - SetupFieldData(commT, sis, worksetSize); + SetupFieldData(comm, sis, worksetSize); } template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setBulkData( - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, const Teuchos::RCP& /* sis */, const unsigned int /* worksetSize */, const std::map >& /*side_set_sis*/) @@ -563,7 +562,7 @@ TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setBulkData( // STK bulkData->modification_begin(); // Begin modifying the mesh - TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::buildMesh(commT); + TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::buildMesh(comm); // STK fix_node_sharing(*bulkData); @@ -572,7 +571,7 @@ TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setBulkData( template<> void -TmplSTKMeshStruct<1>::buildMesh(const Teuchos::RCP& commT) +TmplSTKMeshStruct<1>::buildMesh(const Teuchos::RCP& comm) { stk::mesh::PartVector nodePartVec; stk::mesh::PartVector singlePartVec(1); @@ -641,7 +640,7 @@ TmplSTKMeshStruct<1>::buildMesh(const Teuchos::RCP& commT) if(proc_rank_field){ int* p_rank = stk::mesh::field_data(*proc_rank_field, elem); if(p_rank) - p_rank[0] = commT->getRank(); + p_rank[0] = comm->getRank(); } // Set node sets. There are no side sets currently with 1D problems (only 2D and 3D) @@ -669,7 +668,7 @@ TmplSTKMeshStruct<1>::buildMesh(const Teuchos::RCP& commT) template<> void -TmplSTKMeshStruct<2>::buildMesh(const Teuchos::RCP& /* commT */) +TmplSTKMeshStruct<2>::buildMesh(const Teuchos::RCP& /* comm */) { stk::mesh::PartVector nodePartVec; stk::mesh::PartVector singlePartVec(1); @@ -910,7 +909,7 @@ TmplSTKMeshStruct<2>::buildMesh(const Teuchos::RCP& /* commT template<> void -TmplSTKMeshStruct<3>::buildMesh(const Teuchos::RCP& commT) +TmplSTKMeshStruct<3>::buildMesh(const Teuchos::RCP& comm) { stk::mesh::PartVector nodePartVec; stk::mesh::PartVector singlePartVec(1); @@ -1012,7 +1011,7 @@ TmplSTKMeshStruct<3>::buildMesh(const Teuchos::RCP& commT) if(proc_rank_field){ int* p_rank = stk::mesh::field_data(*proc_rank_field, elem); if(p_rank) - p_rank[0] = commT->getRank(); + p_rank[0] = comm->getRank(); } double* coord; diff --git a/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp b/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp old mode 100755 new mode 100644 diff --git a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp index 56c802d0a8..283a2e97a2 100644 --- a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp +++ b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp @@ -415,16 +415,4 @@ MpasSTKMeshStruct::getValidDiscretizationParameters() const return this->getValidGenericSTKParameters("Valid MpasSTKMeshStructParams"); } -int -MpasSTKMeshStruct::prismType(int const* prismVertexIds, int& minIndex) -{ - int PrismVerticesMap[6][6] = {{0, 1, 2, 3, 4, 5}, {1, 2, 0, 4, 5, 3}, {2, 0, 1, 5, 3, 4}, {3, 5, 4, 0, 2, 1}, {4, 3, 5, 1, 0, 2}, {5, 4, 3, 2, 1, 0}}; - minIndex = std::min_element (prismVertexIds, prismVertexIds + 3) - prismVertexIds; - - int v1 (prismVertexIds[PrismVerticesMap[minIndex][1]]); - int v2 (prismVertexIds[PrismVerticesMap[minIndex][2]]); - - return v1 > v2; -} - } // namespace Albany diff --git a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp index 1767293543..b574064ab0 100644 --- a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp +++ b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp @@ -91,8 +91,6 @@ class MpasSTKMeshStruct : public GenericSTKMeshStruct const std::vector& iceMarginEdgesIds; int numLayers; LayeredMeshOrdering Ordering; - - int prismType(int const* prismVertexIds, int& minIndex); }; } // namespace Albany diff --git a/tests/landIce/AsciiMeshes/Humboldt/CMakeLists.txt b/tests/landIce/AsciiMeshes/Humboldt/CMakeLists.txt index 2502877bbb..fc0b0f9d4a 100644 --- a/tests/landIce/AsciiMeshes/Humboldt/CMakeLists.txt +++ b/tests/landIce/AsciiMeshes/Humboldt/CMakeLists.txt @@ -2,24 +2,8 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_2d.msh ${CMAKE_CURRENT_BINARY_DIR}/humboldt_2d.msh COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_2d.exo ${CMAKE_CURRENT_BINARY_DIR}/humboldt_2d.exo COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_2d.exo.4.0 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_2d.exo.4.0 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_2d.exo.4.1 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_2d.exo.4.1 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_2d.exo.4.2 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_2d.exo.4.2 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_2d.exo.4.3 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_2d.exo.4.3 COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_contiguous_2d.exo ${CMAKE_CURRENT_BINARY_DIR}/humboldt_contiguous_2d.exo COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_contiguous_2d.exo.4.0 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_contiguous_2d.exo.4.0 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_contiguous_2d.exo.4.1 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_contiguous_2d.exo.4.1 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_contiguous_2d.exo.4.2 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_contiguous_2d.exo.4.2 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/humboldt_contiguous_2d.exo.4.3 - ${CMAKE_CURRENT_BINARY_DIR}/humboldt_contiguous_2d.exo.4.3 COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/basal_friction.ascii ${CMAKE_CURRENT_BINARY_DIR}/basal_friction.ascii COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/basal_friction_zeroed.ascii diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.0 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.0 deleted file mode 100644 index 40e50d53dfe86c29d5de3d4575c15f31ad735965..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47520 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 bft-Pyft-Pyft-Pyft-Pyft-P6nSuWRqd8fu diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.1 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.1 deleted file mode 100644 index b6d2d90764fa852a1ee0248f04c8d1ce8578026f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 47448 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 diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.2 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.2 deleted file mode 100644 index 820fe2c6160f1cc6df2b511c3ec3e7b34cd86b60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46432 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 aYev2h2!Rj?fe;9R5D0+~2!RlI1c4uyYS)nf diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.3 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo.4.3 deleted file mode 100644 index 63a8953697bbb2fe9bb3fcc6dce38c6c2ff321e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46972 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 diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.0 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.0 deleted file mode 100644 index aca89de216bd4fc785e5734a3507f062efbbf843..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45500 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 diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.1 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.1 deleted file mode 100644 index 5e27a3d6643a70039d239697b8ecd262722ba3dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45436 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 diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.3 b/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo.4.3 deleted file mode 100644 index e46306d5aea13958854a92b89e7abaf77e4c8ab5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44992 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 Ye2&292z-vf=Lmd`z~>13pNPQ!2Z_5ncK`qY diff --git a/tests/landIce/Enthalpy/input_kleiner_B.yaml b/tests/landIce/Enthalpy/input_kleiner_B.yaml index f0c919e0cd..35b9d0cf27 100644 --- a/tests/landIce/Enthalpy/input_kleiner_B.yaml +++ b/tests/landIce/Enthalpy/input_kleiner_B.yaml @@ -124,7 +124,7 @@ ANONYMOUS: Field Origin: File Field Value: 0.0 Field 4: - Number Of Layers: 41 + Number Of Layers: 81 Vector Dim: 2 Field Name: velocity Field Type: Node Layered Vector diff --git a/tests/landIce/ExoMeshes/CMakeLists.txt b/tests/landIce/ExoMeshes/CMakeLists.txt index b5245d1792..5e7251a144 100644 --- a/tests/landIce/ExoMeshes/CMakeLists.txt +++ b/tests/landIce/ExoMeshes/CMakeLists.txt @@ -44,8 +44,6 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gis20km_in.exo.4.2 ${CMAKE_CURRENT_BINARY_DIR}/gis20km_in.exo.4.2 COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gis20km_in.exo.4.3 ${CMAKE_CURRENT_BINARY_DIR}/gis20km_in.exo.4.3 COPYONLY) -configure_file(${CMAKE_CURRENT_SOURCE_DIR}/square_quad4.jou - ${CMAKE_CURRENT_BINARY_DIR}/square_quad4.jou COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gis_unstruct_2d.exo ${CMAKE_CURRENT_BINARY_DIR}/gis_unstruct_2d.exo COPYONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/gis_unstruct_2d.exo.4.0 diff --git a/tests/landIce/ExoMeshes/square_quad4.jou b/tests/landIce/ExoMeshes/square_quad4.jou deleted file mode 100644 index eabf8d8139..0000000000 --- a/tests/landIce/ExoMeshes/square_quad4.jou +++ /dev/null @@ -1,41 +0,0 @@ -## cubitx -## Cubit Version 12.1 -## Cubit Build 44018 -## Revised 2010-08-12 10:36:21 -0600 (Thu, 12 Aug 2010) -## Running 01/14/2013 09:47:25 AM -## Command Options: -## -warning = On -## -information = On -journal off -brick x 1 y 1 z 1 -move body 1 x 0.5 y 0.5 z 0.5 -curve 1 to 8 interval 5 -curve 9 to 12 interval 1 -block 1 surf 1 -block 1 element quad4 -mesh surf 1 - -sideset 11 curve 3 -sideset 11 name "sideset0" -sideset 12 curve 1 -sideset 12 name "sideset1" -sideset 13 curve 4 -sideset 13 name "sideset2" -sideset 14 curve 2 -sideset 14 name "sideset3" - - -nodeset 21 curve 3 -nodeset 21 name "nodeset0" -nodeset 22 curve 1 -nodeset 22 name "nodeset1" -nodeset 23 curve 4 -nodeset 23 name "nodeset2" -nodeset 24 curve 2 -nodeset 24 name "nodeset3" -nodeset 99 vertex in surf 1 with x_coord == 0 and y_coord == 0 -nodeset 99 name "nodeset99" - - - -export genesis "square_quad4.exo" overwrite diff --git a/tests/landIce/ExoMeshes/square_quad9.jou b/tests/landIce/ExoMeshes/square_quad9.jou deleted file mode 100644 index 7f53a9a83b..0000000000 --- a/tests/landIce/ExoMeshes/square_quad9.jou +++ /dev/null @@ -1,43 +0,0 @@ -## cubitx -## Cubit Version 12.1 -## Cubit Build 44018 -## Revised 2010-08-12 10:36:21 -0600 (Thu, 12 Aug 2010) -## Running 01/14/2013 09:47:25 AM -## Command Options: -## -warning = On -## -information = On -journal off -brick x 1 y 1 z 1 -move body 1 x 0.5 y 0.5 z 0.5 -curve 1 to 8 interval 160 -curve 9 to 12 interval 1 -block 1 surf 1 -block 1 element quad9 -mesh surf 1 - -sideset 11 curve 3 -sideset 11 name "sideset0" -sideset 12 curve 1 -sideset 12 name "sideset1" -sideset 13 curve 4 -sideset 13 name "sideset2" -sideset 14 curve 2 -sideset 14 name "sideset3" - - -nodeset 21 curve 3 -nodeset 21 name "nodeset0" -nodeset 22 curve 1 -nodeset 22 name "nodeset1" -nodeset 23 curve 4 -nodeset 23 name "nodeset2" -nodeset 24 curve 2 -nodeset 24 name "nodeset3" -nodeset 99 vertex in surf 1 with x_coord == 0 and y_coord == 0 -nodeset 99 name "nodeset99" - - - -export genesis "square_quad9.exo" overwrite - - diff --git a/tests/landIce/FO_GIS/CMakeLists.txt b/tests/landIce/FO_GIS/CMakeLists.txt index 32358ae465..bc0abbdc53 100644 --- a/tests/landIce/FO_GIS/CMakeLists.txt +++ b/tests/landIce/FO_GIS/CMakeLists.txt @@ -133,11 +133,17 @@ if (ALBANY_IFPACK2) endif() if (NOT ALBANY_PARALELL_EXODUS) - set (testNameHumboldtDecompMesh ${testNameRoot}_Humboldt_decompMesh) + set (testNameHumboldtDecompMesh ${testNameRoot}_Humboldt_2d_decompMesh) add_test (NAME ${testNameHumboldtDecompMesh} COMMAND ${SerialSeacasDecomp.exe} -processors ${MPIMNP} humboldt_2d.exo WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../AsciiMeshes/Humboldt) - set_tests_properties (${testNameHumboldtDecompMesh} PROPERTIES FIXTURES_SETUP humboldtMeshSetup) + set_tests_properties (${testNameHumboldtDecompMesh} PROPERTIES FIXTURES_SETUP humboldtMeshSetup2d) + + set (testNameHumboldtDecompMesh ${testNameRoot}_Humboldt_contiguous_2d_decompMesh) + add_test (NAME ${testNameHumboldtDecompMesh} + COMMAND ${SerialSeacasDecomp.exe} -processors ${MPIMNP} humboldt_contiguous_2d.exo + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/../AsciiMeshes/Humboldt) + set_tests_properties (${testNameHumboldtDecompMesh} PROPERTIES FIXTURES_SETUP humboldtMeshSetupContiguous2d) endif() if (ALBANY_FROSCH) @@ -153,47 +159,44 @@ if (ALBANY_FROSCH) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/input_fo_humboldt_frosch_fluxdiv.yaml ${CMAKE_CURRENT_BINARY_DIR}/input_fo_humboldt_frosch_fluxdiv.yaml) add_test(${testNameRoot}_Humboldt_FluxDiv_Tpetra_FROSch ${Albany.exe} input_fo_humboldt_frosch_fluxdiv.yaml) + set_tests_properties(${testNameRoot}_Humboldt_FluxDiv_Tpetra_FROSch + PROPERTIES + LABELS "LandIce;Tpetra;Forward") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/input_fo_humboldt_frosch_power_law.yaml ${CMAKE_CURRENT_BINARY_DIR}/input_fo_humboldt_frosch_power_law.yaml) add_test(${testNameRoot}_Humboldt_powerLaw_Tpetra_FROSch ${Albany.exe} input_fo_humboldt_frosch_power_law.yaml) + set_tests_properties(${testNameRoot}_Humboldt_powerLaw_Tpetra_FROSch + PROPERTIES + LABELS "LandIce;Tpetra;Forward") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/input_fo_humboldt_frosch_effect_press.yaml ${CMAKE_CURRENT_BINARY_DIR}/input_fo_humboldt_frosch_effect_press.yaml) add_test(${testNameRoot}_Humboldt_effectPress_Tpetra_FROSch ${Albany.exe} input_fo_humboldt_frosch_effect_press.yaml) + set_tests_properties(${testNameRoot}_Humboldt_effectPress_Tpetra_FROSch + PROPERTIES + LABELS "LandIce;Tpetra;Forward") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/input_fo_humboldt_frosch_pressurized_bed.yaml ${CMAKE_CURRENT_BINARY_DIR}/input_fo_humboldt_frosch_pressurized_bed.yaml) add_test(${testNameRoot}_Humboldt_pressurizedBed_Tpetra_FROSch ${Albany.exe} input_fo_humboldt_frosch_pressurized_bed.yaml) - + set_tests_properties(${testNameRoot}_Humboldt_pressurizedBed_Tpetra_FROSch + PROPERTIES + LABELS "LandIce;Tpetra;Forward") + if (NOT ALBANY_PARALELL_EXODUS) set_tests_properties(${testNameRoot}_Humboldt_FluxDiv_Tpetra_FROSch - PROPERTIES - LABELS "LandIce;Tpetra;Forward" - FIXTURES_REQUIRED humboldtMeshSetup) + PROPERTIES FIXTURES_REQUIRED humboldtMeshSetupContiguous2d) + + set_tests_properties(${testNameRoot}_Humboldt_pressurizedBed_Tpetra_FROSch + PROPERTIES FIXTURES_REQUIRED humboldtMeshSetup2d) set_tests_properties(${testNameRoot}_Humboldt_powerLaw_Tpetra_FROSch - PROPERTIES - LABELS "LandIce;Tpetra;Forward" - FIXTURES_REQUIRED humboldtMeshSetup) + PROPERTIES FIXTURES_REQUIRED humboldtMeshSetup2d) set_tests_properties(${testNameRoot}_Humboldt_effectPress_Tpetra_FROSch - PROPERTIES - LABELS "LandIce;Tpetra;Forward" - FIXTURES_REQUIRED humboldtMeshSetup) + PROPERTIES FIXTURES_REQUIRED humboldtMeshSetup2d) - else () - set_tests_properties(${testNameRoot}_Humboldt_FluxDiv_Tpetra_FROSch - PROPERTIES - LABELS "LandIce;Tpetra;Forward") - - set_tests_properties(${testNameRoot}_Humboldt_powerLaw_Tpetra_FROSch - PROPERTIES - LABELS "LandIce;Tpetra;Forward") - - set_tests_properties(${testNameRoot}_Humboldt_effectPress_Tpetra_FROSch - PROPERTIES - LABELS "LandIce;Tpetra;Forward") endif() endif() @@ -342,12 +345,19 @@ if (ALBANY_IFPACK2) set (testName ${testNameRoot}_Humboldt_Analysis) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/input_fo_humboldt_analysis.yaml ${CMAKE_CURRENT_BINARY_DIR}/input_fo_humboldt_analysis.yaml) - add_test(${testNameRoot}_Humboldt_Analysis ${AlbanyAnalysis.exe} input_fo_humboldt_analysis.yaml) + add_test(${testName} ${AlbanyAnalysis.exe} input_fo_humboldt_analysis.yaml) set (testName ${testNameRoot}_Humboldt_Analysis_Mat_Free_Reg) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/input_fo_humboldt_analysis_mat_free_reg.yaml ${CMAKE_CURRENT_BINARY_DIR}/input_fo_humboldt_analysis_mat_free_reg.yaml) - add_test(${testNameRoot}_Humboldt_Analysis_Analysis_Mat_Free_Reg ${AlbanyAnalysis.exe} input_fo_humboldt_analysis_mat_free_reg.yaml) + add_test(${testName} ${AlbanyAnalysis.exe} input_fo_humboldt_analysis_mat_free_reg.yaml) + + if (NOT ALBANY_PARALELL_EXODUS) + set_tests_properties(${testNameRoot}_Humboldt_Analysis + PROPERTIES FIXTURES_REQUIRED humboldtMeshSetupContiguous2d) + set_tests_properties(${testNameRoot}_Humboldt_Analysis_Mat_Free_Reg + PROPERTIES FIXTURES_REQUIRED humboldtMeshSetupContiguous2d) + endif() endif() endif() diff --git a/tests/unit/Albany_UnitTestSetupHelpers.hpp b/tests/unit/Albany_UnitTestSetupHelpers.hpp index 107097a412..0ad44f56a6 100644 --- a/tests/unit/Albany_UnitTestSetupHelpers.hpp +++ b/tests/unit/Albany_UnitTestSetupHelpers.hpp @@ -65,7 +65,7 @@ createTestDisc (const Teuchos::RCP& comm, layout->dimensions(info->dim); sis->push_back(info); } - return factory.createDiscretization(neq,sis); + return factory.createDiscretization(neq,{},sis,{}); } // Helper to get topology/FEBasis/cubature given mesh dim From 4e4d217f38c18fb1caf2295432b355f50ba55913 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 21 Feb 2024 12:48:44 -0700 Subject: [PATCH 02/12] Store mesh specs as public member of AbstractMeshStruct When you have both const and non-const getters, you may as well store as public member (unless get method needs to perform some sort of extra op, but that's not the case here). --- src/Albany_Application.cpp | 2 +- src/disc/Albany_AbstractMeshStruct.hpp | 5 ++-- src/disc/Albany_DiscretizationFactory.cpp | 10 ++++---- src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp | 4 ++-- .../omegah/Albany_OmegahDiscretization.cpp | 6 ++--- .../omegah/Albany_OmegahDiscretization.hpp | 2 +- src/disc/omegah/Albany_OmegahGenericMesh.hpp | 9 ------- src/disc/omegah/Albany_OmegahOshMesh.cpp | 4 ++-- src/disc/omegah/OmegahConnManager.cpp | 8 +++---- src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 2 +- src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 24 +++---------------- src/disc/stk/Albany_GenericSTKMeshStruct.hpp | 5 ---- src/disc/stk/Albany_STKDiscretization.cpp | 8 +++---- 13 files changed, 29 insertions(+), 60 deletions(-) diff --git a/src/Albany_Application.cpp b/src/Albany_Application.cpp index 1cd5cc4952..b1b2ac11ef 100644 --- a/src/Albany_Application.cpp +++ b/src/Albany_Application.cpp @@ -3376,7 +3376,7 @@ Application::setScaleBCDofs( // nodeset specified via the sideset discretization. // /*const auto &sdn = - disc->getMeshStruct()->getMeshSpecs()[0]->sideSetMeshNames; + disc->getMeshStruct()->meshSpecs[0]->sideSetMeshNames; for (int isd = 0; isd < sdn.size(); ++isd) { const auto &sd = disc->getSideSetDiscretizations().at(sdn[isd]); for (auto iterator = sd->getNodeSets().begin(); diff --git a/src/disc/Albany_AbstractMeshStruct.hpp b/src/disc/Albany_AbstractMeshStruct.hpp index 098413dc04..1585f672d2 100644 --- a/src/disc/Albany_AbstractMeshStruct.hpp +++ b/src/disc/Albany_AbstractMeshStruct.hpp @@ -53,12 +53,13 @@ struct AbstractMeshStruct { setFieldData(comm, sis, worksetSize, side_set_sis); setBulkData(comm, sis, worksetSize, side_set_sis); } - virtual Teuchos::ArrayRCP >& getMeshSpecs() = 0; - virtual const Teuchos::ArrayRCP >& getMeshSpecs() const = 0; Teuchos::RCP > global_cell_layers_data; Teuchos::RCP > local_cell_layers_data; Teuchos::ArrayRCP mesh_layers_ratio; + + Teuchos::ArrayRCP > meshSpecs; + std::map> sideSetMeshStructs; }; } // Namespace Albany diff --git a/src/disc/Albany_DiscretizationFactory.cpp b/src/disc/Albany_DiscretizationFactory.cpp index b7787e0094..bae96efde9 100644 --- a/src/disc/Albany_DiscretizationFactory.cpp +++ b/src/disc/Albany_DiscretizationFactory.cpp @@ -52,7 +52,7 @@ Teuchos::ArrayRCP > DiscretizationFactory::createMeshSpecs() { // First, create the mesh struct meshStruct = createMeshStruct(discParams, comm, num_params); - return meshStruct->getMeshSpecs(); + return meshStruct->meshSpecs; } Teuchos::RCP @@ -103,7 +103,7 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis meshStruct2D = Teuchos::rcp(new AsciiSTKMesh2D(disc_params, comm, numParams)); Teuchos::RCP sis = Teuchos::rcp(new StateInfoStruct); meshStruct2D->setFieldAndBulkData(comm, - sis, meshStruct2D->getMeshSpecs()[0]->worksetSize); + sis, meshStruct2D->meshSpecs[0]->worksetSize); Ioss::Init::Initializer io; Teuchos::RCP mesh_data = Teuchos::rcp(new stk::io::StkMeshIoBroker(MPI_COMM_WORLD)); mesh_data->set_bulk_data(*meshStruct2D->bulkData); @@ -193,7 +193,7 @@ DiscretizationFactory::createDiscretization( Teuchos::ArrayRCP > DiscretizationFactory::createMeshSpecs(Teuchos::RCP mesh) { meshStruct = mesh; - return meshStruct->getMeshSpecs(); + return meshStruct->meshSpecs; } void @@ -209,7 +209,7 @@ DiscretizationFactory::setMeshStructFieldData( { TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructFieldData"); meshStruct->setFieldData(comm, sis, - meshStruct->getMeshSpecs()[0]->worksetSize, side_set_sis); + meshStruct->meshSpecs[0]->worksetSize, side_set_sis); } void @@ -225,7 +225,7 @@ DiscretizationFactory::setMeshStructBulkData( { TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructBulkData"); meshStruct->setBulkData(comm, sis, - meshStruct->getMeshSpecs()[0]->worksetSize, side_set_sis); + meshStruct->meshSpecs[0]->worksetSize, side_set_sis); } diff --git a/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp b/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp index 5896819e0c..675e9bcb28 100644 --- a/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp +++ b/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp @@ -119,8 +119,8 @@ OmegahBoxMesh (const Teuchos::RCP& params, case 3: ctd = shards::getCellTopologyData>(); break; } - this->m_mesh_specs.resize(1); - this->m_mesh_specs[0] = Teuchos::rcp(new MeshSpecsStruct(*ctd, Dim, + this->meshSpecs.resize(1); + this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct(*ctd, Dim, nsNames, ssNames, m_mesh.nelems(), ebName, ebNameToIndex)); } diff --git a/src/disc/omegah/Albany_OmegahDiscretization.cpp b/src/disc/omegah/Albany_OmegahDiscretization.cpp index c2a378e5ef..30e55266ef 100644 --- a/src/disc/omegah/Albany_OmegahDiscretization.cpp +++ b/src/disc/omegah/Albany_OmegahDiscretization.cpp @@ -49,7 +49,7 @@ updateMesh () // Compute workset information // NOTE: these arrays are all of size 1, for the foreseable future. // Still, make impl generic (where possible), in case things change. - const auto& ms = m_mesh_struct->getMeshSpecs()[0]; + const auto& ms = m_mesh_struct->meshSpecs[0]; const auto& mesh = m_mesh_struct->getOmegahMesh(); int nelems = mesh.nelems(); int max_ws_size = ms->worksetSize; @@ -115,7 +115,7 @@ updateMesh () void OmegahDiscretization:: computeNodeSets () { - const auto& nsNames = getMeshStruct()->getMeshSpecs()[0]->nsNames; + const auto& nsNames = getMeshStruct()->meshSpecs[0]->nsNames; using Omega_h::I32; using Omega_h::I8; @@ -271,7 +271,7 @@ create_dof_mgr (const std::string& field_name, const int order, const int dof_dim) const { - const auto& mesh_specs = m_mesh_struct->getMeshSpecs()[0]; + const auto& mesh_specs = m_mesh_struct->meshSpecs[0]; // Create conn and dof managers auto conn_mgr = Teuchos::rcp(new OmegahConnManager(m_mesh_struct)); diff --git a/src/disc/omegah/Albany_OmegahDiscretization.hpp b/src/disc/omegah/Albany_OmegahDiscretization.hpp index 2e72d8cc91..72fcd5b3e7 100644 --- a/src/disc/omegah/Albany_OmegahDiscretization.hpp +++ b/src/disc/omegah/Albany_OmegahDiscretization.hpp @@ -131,7 +131,7 @@ class OmegahDiscretization : public AbstractDiscretization //! Get number of spatial dimensions int getNumDim() const override { - return m_mesh_struct->getMeshSpecs()[0]->numDim; + return m_mesh_struct->meshSpecs[0]->numDim; } //! Get number of total DOFs per node diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.hpp b/src/disc/omegah/Albany_OmegahGenericMesh.hpp index 84b3a3cd32..36b794eddb 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.hpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.hpp @@ -18,13 +18,6 @@ class OmegahGenericMesh : public AbstractMeshStruct { // ------------- Override from base class ------------- // std::string meshType () const override { return "Omega_h"; } - Teuchos::ArrayRCP>& - getMeshSpecs() override { return m_mesh_specs; } - - const Teuchos::ArrayRCP>& - getMeshSpecs() const override { return m_mesh_specs; } - - void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize, @@ -63,8 +56,6 @@ class OmegahGenericMesh : public AbstractMeshStruct { // Given a part name, returns its topology (in the form of an Omega_h enum std::map m_part_topo; - Teuchos::ArrayRCP > m_mesh_specs; - Teuchos::RCP m_field_accessor; DeviceView1d m_coords_d; diff --git a/src/disc/omegah/Albany_OmegahOshMesh.cpp b/src/disc/omegah/Albany_OmegahOshMesh.cpp index 76d8d7e14a..3ef3ca8a21 100644 --- a/src/disc/omegah/Albany_OmegahOshMesh.cpp +++ b/src/disc/omegah/Albany_OmegahOshMesh.cpp @@ -93,8 +93,8 @@ OmegahOshMesh (const Teuchos::RCP& params, this->declare_part(ebName,elem_topo); // Omega_h does not know what worksets are, so all elements are in one workset - this->m_mesh_specs.resize(1); - this->m_mesh_specs[0] = Teuchos::rcp(new MeshSpecsStruct(*ctd, m_mesh.dim(), + this->meshSpecs.resize(1); + this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct(*ctd, m_mesh.dim(), nsNames, ssNames, m_mesh.nelems(), ebName, ebNameToIndex)); } diff --git a/src/disc/omegah/OmegahConnManager.cpp b/src/disc/omegah/OmegahConnManager.cpp index 9df0ccb3b5..5958f7cfad 100644 --- a/src/disc/omegah/OmegahConnManager.cpp +++ b/src/disc/omegah/OmegahConnManager.cpp @@ -26,7 +26,7 @@ namespace Albany { Omega_h::Read getIsEntInPart(const OmegahGenericMesh& albanyMesh, const std::string& part_name) { const auto& mesh = albanyMesh.getOmegahMesh(); const int part_dim = albanyMesh.part_dim(part_name); - if(part_name == albanyMesh.getMeshSpecs()[0]->ebName) { + if(part_name == albanyMesh.meshSpecs[0]->ebName) { return Omega_h::Read(mesh.nents(part_dim), 1); } else { return mesh.get_array(part_dim, part_name); @@ -54,7 +54,7 @@ Omega_h::LOs numberEntsInPart(const OmegahGenericMesh& albanyMesh, const std::st LO getNumEntsInPart(const OmegahGenericMesh& albanyMesh, const std::string& part_name) { const auto& mesh = albanyMesh.getOmegahMesh(); const int part_dim = albanyMesh.part_dim(part_name); - if(part_name == albanyMesh.getMeshSpecs()[0]->ebName) { + if(part_name == albanyMesh.meshSpecs[0]->ebName) { return mesh.nents(part_dim); } else { const auto isInPart = getIsEntInPart(albanyMesh,part_name); @@ -65,7 +65,7 @@ LO getNumEntsInPart(const OmegahGenericMesh& albanyMesh, const std::string& part [[nodiscard]] std::vector getLocalElmIds(const OmegahGenericMesh& albanyMesh, const std::string& part_name) { const auto& mesh = albanyMesh.getOmegahMesh(); - if(part_name==albanyMesh.getMeshSpecs()[0]->ebName) { + if(part_name==albanyMesh.meshSpecs[0]->ebName) { std::vector localElmIds(mesh.nelems()); std::iota(localElmIds.begin(), localElmIds.end(), 0); return localElmIds; @@ -79,7 +79,7 @@ std::vector getLocalElmIds(const OmegahGenericMesh& albanyMesh, const std:: OmegahConnManager:: OmegahConnManager(const Teuchos::RCP& in_mesh) : OmegahConnManager(in_mesh, - in_mesh->getMeshSpecs()[0]->ebName) + in_mesh->meshSpecs[0]->ebName) { // Nothing to do here } diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 0bc9c5c784..3ab48f9443 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -117,7 +117,7 @@ ExtrudedSTKMeshStruct(const Teuchos::RCP& params, sideSetMeshStructs["basalside"] = basalMeshStruct; - const auto& basalMeshSpec = basalMeshStruct->getMeshSpecs()[0]; + const auto& basalMeshSpec = basalMeshStruct->meshSpecs[0]; std::string elem2d_name(basalMeshSpec->ctd.base->name); std::string tria = shards::getCellTopologyData >()->name; std::string quad = shards::getCellTopologyData >()->name; diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index e97e99bdca..6a792fa5e5 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -236,24 +236,6 @@ This function gets rid of the subset in the list. } } -Teuchos::ArrayRCP >& -GenericSTKMeshStruct::getMeshSpecs() -{ - TEUCHOS_TEST_FOR_EXCEPTION(meshSpecs==Teuchos::null, - std::logic_error, - "meshSpecs accessed, but it has not been constructed" << std::endl); - return meshSpecs; -} - -const Teuchos::ArrayRCP >& -GenericSTKMeshStruct::getMeshSpecs() const -{ - TEUCHOS_TEST_FOR_EXCEPTION(meshSpecs==Teuchos::null, - std::logic_error, - "meshSpecs accessed, but it has not been constructed" << std::endl); - return meshSpecs; -} - int GenericSTKMeshStruct::computeWorksetSize(const int worksetSizeMax, const int ebSizeMax) const { @@ -438,7 +420,7 @@ void GenericSTKMeshStruct::checkNodeSetsFromSideSetsIntegrity () void GenericSTKMeshStruct::initializeSideSetMeshSpecs (const Teuchos::RCP& comm) { // Loop on all mesh specs - for (auto ms: this->getMeshSpecs() ) { + for (auto ms : meshSpecs ) { // Loop on all side sets of the mesh for (auto ssName : ms->ssNames) { // Get the part @@ -529,7 +511,7 @@ void GenericSTKMeshStruct::initializeSideSetMeshStructs (const Teuchos::RCPmeshSpecs[0]->sideSetMeshSpecs[ss_name] = this->sideSetMeshStructs[ss_name]->getMeshSpecs(); + this->meshSpecs[0]->sideSetMeshSpecs[ss_name] = this->sideSetMeshStructs[ss_name]->meshSpecs; this->meshSpecs[0]->sideSetMeshNames.push_back(ss_name); // We need to create the 2D cell -> (3D cell, side_node_ids) map in the side mesh now @@ -540,7 +522,7 @@ void GenericSTKMeshStruct::initializeSideSetMeshStructs (const Teuchos::RCP (3D cell, side_node_ids) map in the side mesh now - const int num_nodes = sideSetMeshStructs[ss_name]->getMeshSpecs()[0]->ctd.node_count; + const int num_nodes = sideSetMeshStructs[ss_name]->meshSpecs[0]->ctd.node_count; ISFT* side_nodes_ids = &this->sideSetMeshStructs[ss_name]->metaData->declare_field (stk::topology::ELEM_RANK, "side_nodes_ids"); stk::mesh::put_field_on_mesh(*side_nodes_ids, this->sideSetMeshStructs[ss_name]->metaData->universal_part(), num_nodes, nullptr); #ifdef ALBANY_SEACAS diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp index a21424b350..ae10b526d5 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp @@ -25,9 +25,6 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct virtual ~GenericSTKMeshStruct() = default; - Teuchos::ArrayRCP >& getMeshSpecs(); - const Teuchos::ArrayRCP >& getMeshSpecs() const; - //! Re-load balance adapted mesh void rebalanceAdaptedMesh (const Teuchos::RCP& params, const Teuchos::RCP& comm); @@ -146,8 +143,6 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct Teuchos::RCP params; - Teuchos::ArrayRCP > meshSpecs; - bool requiresAutomaticAura; std::vector m_nodesets_from_sidesets; diff --git a/src/disc/stk/Albany_STKDiscretization.cpp b/src/disc/stk/Albany_STKDiscretization.cpp index b9e92d4b6a..f5dcd57d08 100644 --- a/src/disc/stk/Albany_STKDiscretization.cpp +++ b/src/disc/stk/Albany_STKDiscretization.cpp @@ -1318,7 +1318,7 @@ STKDiscretization::computeWorksetInfo() } else { for (int i = 0; i < numBuckets; ++i) { m_wsPhysIndex[i] = - stkMeshStruct->getMeshSpecs()[0]->ebNameToIndex[m_wsEBNames[i]]; + stkMeshStruct->meshSpecs[0]->ebNameToIndex[m_wsEBNames[i]]; } } @@ -1630,7 +1630,7 @@ STKDiscretization::computeSideSets() // Save the index of the element block that this elem lives in sStruct.elem_ebIndex = - stkMeshStruct->getMeshSpecs()[0]->ebNameToIndex[m_wsEBNames[workset]]; + stkMeshStruct->meshSpecs[0]->ebNameToIndex[m_wsEBNames[workset]]; // Get or create the vector of side structs for this side set on this workset auto& ss_vec = sideSets[workset][ss.first]; @@ -1795,7 +1795,7 @@ STKDiscretization::computeSideSets() unsigned int maxSideNodes = 0; const auto& cell_layers_data = stkMeshStruct->local_cell_layers_data; if (!cell_layers_data.is_null()) { - const Teuchos::RCP cell_topo = Teuchos::rcp(new CellTopologyData(stkMeshStruct->getMeshSpecs()[0]->ctd)); + const Teuchos::RCP cell_topo = Teuchos::rcp(new CellTopologyData(stkMeshStruct->meshSpecs[0]->ctd)); const int numLayers = cell_layers_data->numLayers; const int numComps = getDOFManager()->getNumFields(); @@ -1832,7 +1832,7 @@ STKDiscretization::computeSideSets() // If the mesh isn't extruded, we won't need to do any of the following work. if (not cell_layers_data.is_null()) { // Get topo data - auto ctd = stkMeshStruct->getMeshSpecs()[0]->ctd; + auto ctd = stkMeshStruct->meshSpecs[0]->ctd; // Ensure we have ONE cell per layer. const auto topo_hexa = shards::getCellTopologyData>(); From 1701ecfd6b81e6cf5875b9da4aab38dea2d6da1b Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 21 Feb 2024 12:27:18 -0700 Subject: [PATCH 03/12] Use only simple fields from STK * Force STK io broker to use simple fields. Otherwise, vector fields are declared with Cartesian tag. * Use simple fields in all meta data structs of STK meshes * Fixed STK field containers handling of STK fields Now that we use simple fields, there is no field_array_rank in stk fields anymore, and there is no distinction between "scalar" and "vector" fields (in terms of static type) * In Ioss mesh, cannot query field array rank of a stk Field anymore * In STKDiscretization, metaData's get_field only needs the data type as template arg --- src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 28 +-- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 1 + .../stk/Albany_MultiSTKFieldContainer.cpp | 41 +-- .../stk/Albany_OrdinarySTKFieldContainer.cpp | 56 +---- src/disc/stk/Albany_STKDiscretization.cpp | 21 +- .../stk/Albany_STKFieldContainerHelper.cpp | 224 ++++++++++++++++- .../stk/Albany_STKFieldContainerHelper.hpp | 3 +- .../Albany_STKFieldContainerHelper_Def.hpp | 236 ------------------ 8 files changed, 251 insertions(+), 359 deletions(-) delete mode 100644 src/disc/stk/Albany_STKFieldContainerHelper_Def.hpp diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index 6a792fa5e5..d9dd678de1 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -57,6 +57,7 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( num_params(numParams_) { metaData = Teuchos::rcp(new stk::mesh::MetaData()); + metaData->use_simple_fields(); // numDim = -1 is default flag value to postpone initialization if (numDim_>0) { @@ -1422,32 +1423,13 @@ void GenericSTKMeshStruct::checkFieldIsInMesh (const std::string& fname, const s entity_rank = stk::topology::NODE_RANK; } - int dim = 1; - if (ftype.find("Vector")!=std::string::npos) { - ++dim; - } - if (ftype.find("Layered")!=std::string::npos) { - ++dim; - } - bool missing = (metaData->get_field (entity_rank, fname)==nullptr); if (missing) { - bool isFieldInMesh = false; - auto fl = metaData->get_fields(); - auto f = fl.begin(); - for (; f != fl.end(); ++f) { - isFieldInMesh = (fname == (*f)->name()); - if(isFieldInMesh) break; - } - if(isFieldInMesh) { - TEUCHOS_TEST_FOR_EXCEPTION (missing, std::runtime_error, "Error! The field '" << fname << "' in the mesh has different rank or dimensions than the ones specified\n" - << " Rank required: " << entity_rank << ", rank of field in mesh: " << (*f)->entity_rank() << "\n" - << " Dimension required: " << dim << ", dimension of field in mesh: " << (*f)->field_array_rank()+1 << "\n"); - } - else - TEUCHOS_TEST_FOR_EXCEPTION (missing, std::runtime_error, "Error! The field '" << fname << "' was not found in the mesh.\n" - << " Probably it was not registered it in the state manager (which forwards it to the mesh)\n"); + TEUCHOS_TEST_FOR_EXCEPTION ( + missing, std::runtime_error, + "Error! The field '" << fname << "' was not found in the mesh.\n" + " Probably it was not registered it in the state manager (which forwards it to the mesh)\n"); } } diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index 3f734a4a0d..4a754b9f13 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -70,6 +70,7 @@ IossSTKMeshStruct(const Teuchos::RCP& params_, auto mpiComm = getMpiCommFromTeuchosComm(comm); mesh_data = Teuchos::rcp(new stk::io::StkMeshIoBroker(mpiComm)); + mesh_data->use_simple_fields(); // Use Greg Sjaardema's capability to repartition on the fly. // Several partitioning choices: rcb, rib, hsfc, kway, kway-gemo, linear, random diff --git a/src/disc/stk/Albany_MultiSTKFieldContainer.cpp b/src/disc/stk/Albany_MultiSTKFieldContainer.cpp index 25bf11eb0a..ec0dfc0c3a 100644 --- a/src/disc/stk/Albany_MultiSTKFieldContainer.cpp +++ b/src/disc/stk/Albany_MultiSTKFieldContainer.cpp @@ -421,25 +421,9 @@ fillVectorImpl (Thyra_Vector& field_vector, auto* raw_field = metaData->get_field(field_entity_rank, field_name); ALBANY_EXPECT (raw_field != nullptr, "Error! Something went wrong while retrieving a field.\n"); - const int rank = raw_field->field_array_rank(); - - using SFT = typename AbstractSTKFieldContainer::STKFieldType; - using Helper = STKFieldContainerHelper; - if (rank == 0) { - - const SFT* field = this->metaData->template get_field( - field_entity_rank, field_name); - Helper::fillVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped, components); - } else if (rank == 1) { - const SFT* field = this->metaData->template get_field( - field_entity_rank, field_name); - Helper::fillVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped, components); - } else { - TEUCHOS_TEST_FOR_EXCEPTION( - true, - std::runtime_error, - "Error! Only scalar and vector fields supported so far.\n"); - } + + const auto* field = this->metaData->template get_field(field_entity_rank, field_name); + STKFieldContainerHelper::fillVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped, components); } void MultiSTKFieldContainer:: @@ -471,22 +455,9 @@ saveVectorImpl (const Thyra_Vector& field_vector, auto* raw_field = metaData->get_field(field_entity_rank, field_name); ALBANY_EXPECT (raw_field != nullptr, "Error! Something went wrong while retrieving a field.\n"); - const int rank = raw_field->field_array_rank(); - - using SFT = typename AbstractSTKFieldContainer::STKFieldType; - using Helper = STKFieldContainerHelper; - if (rank == 0) { - SFT* field = this->metaData->template get_field( - stk::topology::NODE_RANK, field_name); - Helper::saveVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped, components); - } else if (rank == 1) { - SFT* field = this->metaData->template get_field( - stk::topology::NODE_RANK, field_name); - Helper::saveVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped, components); - } else { - TEUCHOS_TEST_FOR_EXCEPTION (true, std::runtime_error, - "Error! Only scalar and vector fields supported so far.\n"); - } + + auto* field = this->metaData->template get_field(field_entity_rank, field_name); + STKFieldContainerHelper::saveVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped, components); } } // namespace Albany diff --git a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp index 608e4b597c..6d29bcd21e 100644 --- a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp +++ b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp @@ -59,13 +59,11 @@ OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( #endif // Start STK stuff - this->coordinates_field = - metaData_->get_field(stk::topology::NODE_RANK, "coordinates"); - + this->coordinates_field = metaData_->get_field(stk::topology::NODE_RANK, "coordinates"); + //STK throws when declaring a field that has been already declared if(this->coordinates_field == nullptr) { - this->coordinates_field = - &metaData_->declare_field(stk::topology::NODE_RANK, "coordinates"); + this->coordinates_field = &metaData_->declare_field(stk::topology::NODE_RANK, "coordinates"); } stk::mesh::put_field_on_mesh( *this->coordinates_field, metaData_->universal_part(), numDim_, nullptr); @@ -337,9 +335,7 @@ transferSolutionToCoords() TEUCHOS_TEST_FOR_EXCEPTION (!this->solutionFieldContainer, std::logic_error, "Error OrdinarySTKFieldContainer::transferSolutionToCoords not called from a solution field container.\n"); - using SFT = typename AbstractSTKFieldContainer::STKFieldType; - using Helper = STKFieldContainerHelper; - Helper::copySTKField(*solution_field[0], *this->coordinates_field); + STKFieldContainerHelper::copySTKField(*solution_field[0], *this->coordinates_field); } void OrdinarySTKFieldContainer:: @@ -370,25 +366,9 @@ fillVectorImpl(Thyra_Vector& field_vector, auto* raw_field = metaData->get_field(field_entity_rank, field_name); ALBANY_EXPECT (raw_field != nullptr, "Error! Something went wrong while retrieving a field.\n"); - const int rank = raw_field->field_array_rank(); - - using SFT = typename AbstractSTKFieldContainer::STKFieldType; - using Helper = STKFieldContainerHelper; - - if (rank == 0) { - const SFT* field = this->metaData->template get_field( - field_entity_rank, field_name); - Helper::fillVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped); - } else if (rank == 1) { - const SFT* field = this->metaData->template get_field( - field_entity_rank, field_name); - Helper::fillVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped); - } else { - TEUCHOS_TEST_FOR_EXCEPTION( - true, - std::runtime_error, - "Error! Only scalar and vector fields supported so far.\n"); - } + + const auto* field = this->metaData->template get_field(field_entity_rank, field_name); + STKFieldContainerHelper::fillVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped); } void OrdinarySTKFieldContainer:: @@ -419,25 +399,9 @@ saveVectorImpl (const Thyra_Vector& field_vector, auto* raw_field = metaData->get_field(field_entity_rank, field_name); ALBANY_EXPECT (raw_field != nullptr, "Error! Something went wrong while retrieving a field.\n"); - const int rank = raw_field->field_array_rank(); - - using SFT = typename AbstractSTKFieldContainer::STKFieldType; - using Helper = STKFieldContainerHelper; - - if (rank == 0) { - SFT* field = this->metaData->template get_field( - stk::topology::NODE_RANK, field_name); - Helper::saveVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped); - } else if (rank == 1) { - SFT* field = this->metaData->template get_field( - stk::topology::NODE_RANK, field_name); - Helper::saveVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped); - } else { - TEUCHOS_TEST_FOR_EXCEPTION( - true, - std::runtime_error, - "Error! Only scalar and vector fields supported so far.\n"); - } + + auto* field = this->metaData->template get_field(field_entity_rank, field_name); + STKFieldContainerHelper::saveVector(field_vector, *field, *this->bulkData, field_dof_mgr, overlapped); } } // namespace Albany diff --git a/src/disc/stk/Albany_STKDiscretization.cpp b/src/disc/stk/Albany_STKDiscretization.cpp index f5dcd57d08..dc885f3af9 100644 --- a/src/disc/stk/Albany_STKDiscretization.cpp +++ b/src/disc/stk/Albany_STKDiscretization.cpp @@ -347,8 +347,7 @@ STKDiscretization::transformMesh() stkMeshStruct->PBCStruct.scale[0] *= L; stkMeshStruct->PBCStruct.scale[1] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); @@ -378,8 +377,7 @@ STKDiscretization::transformMesh() stkMeshStruct->PBCStruct.scale[0] *= L; stkMeshStruct->PBCStruct.scale[1] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); @@ -410,8 +408,7 @@ STKDiscretization::transformMesh() stkMeshStruct->PBCStruct.scale[0] *= L; stkMeshStruct->PBCStruct.scale[1] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); @@ -430,8 +427,7 @@ STKDiscretization::transformMesh() stkMeshStruct->PBCStruct.scale[0] *= L; stkMeshStruct->PBCStruct.scale[1] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); @@ -450,8 +446,7 @@ STKDiscretization::transformMesh() stkMeshStruct->PBCStruct.scale[0] *= L; stkMeshStruct->PBCStruct.scale[1] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); @@ -475,8 +470,7 @@ STKDiscretization::transformMesh() stkMeshStruct->PBCStruct.scale[0] *= L; stkMeshStruct->PBCStruct.scale[1] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); @@ -506,8 +500,7 @@ STKDiscretization::transformMesh() #endif stkMeshStruct->PBCStruct.scale[0] *= L; stk::mesh::Field* surfaceHeight_field = - metaData->get_field>( - stk::topology::NODE_RANK, "surface_height"); + metaData->get_field(stk::topology::NODE_RANK, "surface_height"); const auto numOverlapNodes = getLocalSubdim(getOverlapNodeVectorSpace()); for (int i = 0; i < numOverlapNodes; i++) { double* x = stk::mesh::field_data(*coordinates_field, overlapnodes[i]); diff --git a/src/disc/stk/Albany_STKFieldContainerHelper.cpp b/src/disc/stk/Albany_STKFieldContainerHelper.cpp index 7402b47b94..b463bdd9fa 100644 --- a/src/disc/stk/Albany_STKFieldContainerHelper.cpp +++ b/src/disc/stk/Albany_STKFieldContainerHelper.cpp @@ -5,11 +5,227 @@ //*****************************************************************// #include "Albany_STKFieldContainerHelper.hpp" -#include "Albany_STKFieldContainerHelper_Def.hpp" -#include "Albany_AbstractSTKFieldContainer.hpp" +#include "Albany_STKUtils.hpp" +#include "Albany_GlobalLocalIndexer.hpp" +#include "Albany_ThyraUtils.hpp" -namespace Albany { +#include +#include +#include + +namespace Albany +{ + +// Fill the result vector +// Create a multidimensional array view of the +// solution field data for this bucket of nodes. +// The array is two dimensional (NumberNodes, FieldDim) +// where FieldDim=1 for scalar field, and 1+ for vector fields +void STKFieldContainerHelper:: +fillVector ( Thyra_Vector& field_thyra, + const FieldType& field_stk, + const stk::mesh::BulkData& bulkData, + const Teuchos::RCP& dof_mgr, + const bool overlapped, + const std::vector& components) +{ + constexpr int rank = FieldRank::n; + static_assert(rank==0 || rank==1, + "Error! Can only handle Scalar and Vector fields for now.\n"); + + using ScalarT = typename FieldScalar::type; + using ViewT = Kokkos::View; + + const auto& elem_dof_lids = dof_mgr->elem_dof_lids().host(); + const bool restricted = dof_mgr->part_name()!=dof_mgr->elem_block_name(); + + auto data = getNonconstLocalData(field_thyra); + constexpr auto ELEM_RANK = stk::topology::ELEM_RANK; + const auto& elems = dof_mgr->getAlbanyConnManager()->getElementsInBlock(); + const int num_elems = elems.size(); + const auto indexer = dof_mgr->indexer(); + +#ifdef ALBANY_DEBUG + // Safety check + if (elems.size()>0) { + const auto& e0 = bulkData.get_entity(ELEM_RANK,elems[0]+1); + const auto& n0 = *bulkData.begin_nodes(e0); + TEUCHOS_TEST_FOR_EXCEPTION (stk::mesh::field_scalars_per_entity(field_stk,n0) const std::vector& + { + return dof_mgr->getGIDFieldOffsets(eq); + }; + for (int ielem=0; ielemgetElementGIDs(ielem); + for (int i=0; igetLocalElement(gids[get_offsets(0)[i]]); + if (owned_lid<0) { + continue; + } + } + auto stk_data = stk::mesh::field_data(field_stk,nodes[i]); + for (auto fid : components) { + const auto& offsets = get_offsets(fid); + const auto lid = elem_dof_lids(ielem,offsets[i]); + if (!restricted ||lid>=0) { + data[lid] = stk_data[fid]; + } + } + } + } +} + +// Shortcut for 'get all fields' +void STKFieldContainerHelper:: +fillVector ( Thyra_Vector& field_thyra, + const FieldType& field_stk, + const stk::mesh::BulkData& bulkData, + const Teuchos::RCP& dof_mgr, + const bool overlapped) +{ + std::vector components(dof_mgr->getNumFields()); + std::iota(components.begin(),components.end(),0); + fillVector(field_thyra,field_stk,bulkData,dof_mgr,overlapped,components); +} + +void STKFieldContainerHelper:: +saveVector(const Thyra_Vector& field_thyra, + FieldType& field_stk, + const stk::mesh::BulkData& bulkData, + const Teuchos::RCP& dof_mgr, + const bool overlapped, + const std::vector& components) +{ + constexpr int rank = FieldRank::n; + static_assert(rank==0 || rank==1, + "Error! Can only handle scalar and vector fields for now.\n"); + + using ScalarT = typename FieldScalar::type; + using ViewT = Kokkos::View; + + const auto& elem_dof_lids = dof_mgr->elem_dof_lids().host(); + const bool restricted = dof_mgr->part_name()!=dof_mgr->elem_block_name(); + + auto data = getLocalData(field_thyra); + constexpr auto ELEM_RANK = stk::topology::ELEM_RANK; + const auto& elems = dof_mgr->getAlbanyConnManager()->getElementsInBlock(); + const int num_elems = elems.size(); + const auto indexer = dof_mgr->indexer(); + +#ifdef ALBANY_DEBUG + // Safety check + if (elems.size()>0) { + const auto& e0 = bulkData.get_entity(ELEM_RANK,elems[0]+1); + const auto& n0 = *bulkData.begin_nodes(e0); + TEUCHOS_TEST_FOR_EXCEPTION (stk::mesh::field_scalars_per_entity(field_stk,n0) const std::vector& + { + return dof_mgr->getGIDFieldOffsets(eq); + }; + for (int ielem=0; ielemgetElementGIDs(ielem); + for (int i=0; igetLocalElement(gids[get_offsets(0)[i]]); + if (owned_lid<0) { + continue; + } + } + auto stk_data = stk::mesh::field_data(field_stk,nodes[i]); + for (auto fid : components) { + const auto& offsets = get_offsets(fid); + const auto lid = elem_dof_lids(ielem,offsets[i]); + if (!restricted or lid>=0) { + stk_data[fid] = data[lid]; + } + } + } + } +} + +void STKFieldContainerHelper:: +copySTKField(const FieldType& source, + FieldType& target) +{ + constexpr int rank = FieldRank::n; + static_assert(rank==0 || rank==1, + "Error! Can only handle scalar and vector fields for now.\n"); + + using ScalarT = typename FieldScalar::type; + using SrcViewT = Kokkos::View; + using TgtViewT = Kokkos::View< ScalarT**,Kokkos::LayoutRight,Kokkos::HostSpace>; + + const stk::mesh::BulkData& mesh = source.get_mesh(); + const stk::mesh::BucketVector& bv = mesh.buckets(stk::topology::NODE_RANK); + + for (auto it : bv) { + const stk::mesh::Bucket& bucket = *it; + const int num_nodes_in_bucket = bucket.size(); + const int num_source_components = stk::mesh::field_scalars_per_entity(target, bucket); + const int num_target_components = stk::mesh::field_scalars_per_entity(target, bucket); + + const int uneven_downsampling = num_source_components % num_target_components; + TEUCHOS_TEST_FOR_EXCEPTION(uneven_downsampling, std::logic_error, + "Error in stk fields: specification of coordinate vector vs. solution layout is incorrect.\n"); + + auto src_stk_data = stk::mesh::field_data(source,bucket); + auto tgt_stk_data = stk::mesh::field_data(target,bucket); + + SrcViewT src_view (src_stk_data,num_nodes_in_bucket,num_source_components); + TgtViewT tgt_view (tgt_stk_data,num_nodes_in_bucket,num_target_components); + + for(int i=0; i& dof_mgr, + const bool overlapped) +{ + std::vector components(dof_mgr->getNumFields()); + std::iota(components.begin(),components.end(),0); + saveVector(field_thyra,field_stk,bulkData,dof_mgr,overlapped,components); +} -template struct STKFieldContainerHelper; } // namespace Albany diff --git a/src/disc/stk/Albany_STKFieldContainerHelper.hpp b/src/disc/stk/Albany_STKFieldContainerHelper.hpp index e621c15964..8ec7cb5a9d 100644 --- a/src/disc/stk/Albany_STKFieldContainerHelper.hpp +++ b/src/disc/stk/Albany_STKFieldContainerHelper.hpp @@ -17,9 +17,10 @@ namespace Albany { class GlobalLocalIndexer; // FieldType can be either scalar or vector, the code is the same. -template struct STKFieldContainerHelper { + using FieldType = stk::mesh::Field; + // Fill (aka get) and save (aka set) methods // If passing no components, we do all fields in the dof mgr diff --git a/src/disc/stk/Albany_STKFieldContainerHelper_Def.hpp b/src/disc/stk/Albany_STKFieldContainerHelper_Def.hpp deleted file mode 100644 index c757cdcf94..0000000000 --- a/src/disc/stk/Albany_STKFieldContainerHelper_Def.hpp +++ /dev/null @@ -1,236 +0,0 @@ -//*****************************************************************// -// Albany 3.0: Copyright 2016 Sandia Corporation // -// This Software is released under the BSD license detailed // -// in the file "license.txt" in the top-level Albany directory // -//*****************************************************************// - -#include "Albany_STKFieldContainerHelper.hpp" -#include "Albany_STKUtils.hpp" -#include "Albany_GlobalLocalIndexer.hpp" -#include "Albany_ThyraUtils.hpp" - -#include -#include -#include - -namespace Albany -{ - -// Fill the result vector -// Create a multidimensional array view of the -// solution field data for this bucket of nodes. -// The array is two dimensional (NumberNodes, FieldDim) -// where FieldDim=1 for scalar field, and 1+ for vector fields -template -void STKFieldContainerHelper:: -fillVector ( Thyra_Vector& field_thyra, - const FieldType& field_stk, - const stk::mesh::BulkData& bulkData, - const Teuchos::RCP& dof_mgr, - const bool overlapped, - const std::vector& components) -{ - constexpr int rank = FieldRank::n; - static_assert(rank==0 || rank==1, - "Error! Can only handle Scalar and Vector fields for now.\n"); - - using ScalarT = typename FieldScalar::type; - using ViewT = Kokkos::View; - - const auto& elem_dof_lids = dof_mgr->elem_dof_lids().host(); - const bool restricted = dof_mgr->part_name()!=dof_mgr->elem_block_name(); - - auto data = getNonconstLocalData(field_thyra); - constexpr auto ELEM_RANK = stk::topology::ELEM_RANK; - const auto& elems = dof_mgr->getAlbanyConnManager()->getElementsInBlock(); - const int num_elems = elems.size(); - const auto indexer = dof_mgr->indexer(); - -#ifdef ALBANY_DEBUG - // Safety check - if (elems.size()>0) { - const auto& e0 = bulkData.get_entity(ELEM_RANK,elems[0]+1); - const auto& n0 = *bulkData.begin_nodes(e0); - TEUCHOS_TEST_FOR_EXCEPTION (stk::mesh::field_scalars_per_entity(field_stk,n0) const std::vector& - { - return dof_mgr->getGIDFieldOffsets(eq); - }; - for (int ielem=0; ielemgetElementGIDs(ielem); - for (int i=0; igetLocalElement(gids[get_offsets(0)[i]]); - if (owned_lid<0) { - continue; - } - } - auto stk_data = stk::mesh::field_data(field_stk,nodes[i]); - for (auto fid : components) { - const auto& offsets = get_offsets(fid); - const auto lid = elem_dof_lids(ielem,offsets[i]); - if (!restricted ||lid>=0) { - data[lid] = stk_data[fid]; - } - } - } - } -} - -// Shortcut for 'get all fields' -template -void STKFieldContainerHelper:: -fillVector ( Thyra_Vector& field_thyra, - const FieldType& field_stk, - const stk::mesh::BulkData& bulkData, - const Teuchos::RCP& dof_mgr, - const bool overlapped) -{ - std::vector components(dof_mgr->getNumFields()); - std::iota(components.begin(),components.end(),0); - fillVector(field_thyra,field_stk,bulkData,dof_mgr,overlapped,components); -} - -template -void STKFieldContainerHelper:: -saveVector(const Thyra_Vector& field_thyra, - FieldType& field_stk, - const stk::mesh::BulkData& bulkData, - const Teuchos::RCP& dof_mgr, - const bool overlapped, - const std::vector& components) -{ - constexpr int rank = FieldRank::n; - static_assert(rank==0 || rank==1, - "Error! Can only handle scalar and vector fields for now.\n"); - - using ScalarT = typename FieldScalar::type; - using ViewT = Kokkos::View; - - const auto& elem_dof_lids = dof_mgr->elem_dof_lids().host(); - const bool restricted = dof_mgr->part_name()!=dof_mgr->elem_block_name(); - - auto data = getLocalData(field_thyra); - constexpr auto ELEM_RANK = stk::topology::ELEM_RANK; - const auto& elems = dof_mgr->getAlbanyConnManager()->getElementsInBlock(); - const int num_elems = elems.size(); - const auto indexer = dof_mgr->indexer(); - -#ifdef ALBANY_DEBUG - // Safety check - if (elems.size()>0) { - const auto& e0 = bulkData.get_entity(ELEM_RANK,elems[0]+1); - const auto& n0 = *bulkData.begin_nodes(e0); - TEUCHOS_TEST_FOR_EXCEPTION (stk::mesh::field_scalars_per_entity(field_stk,n0) const std::vector& - { - return dof_mgr->getGIDFieldOffsets(eq); - }; - for (int ielem=0; ielemgetElementGIDs(ielem); - for (int i=0; igetLocalElement(gids[get_offsets(0)[i]]); - if (owned_lid<0) { - continue; - } - } - auto stk_data = stk::mesh::field_data(field_stk,nodes[i]); - for (auto fid : components) { - const auto& offsets = get_offsets(fid); - const auto lid = elem_dof_lids(ielem,offsets[i]); - if (!restricted or lid>=0) { - stk_data[fid] = data[lid]; - } - } - } - } -} - -template -void STKFieldContainerHelper:: -copySTKField(const FieldType& source, - FieldType& target) -{ - constexpr int rank = FieldRank::n; - static_assert(rank==0 || rank==1, - "Error! Can only handle scalar and vector fields for now.\n"); - - using ScalarT = typename FieldScalar::type; - using SrcViewT = Kokkos::View; - using TgtViewT = Kokkos::View< ScalarT**,Kokkos::LayoutRight,Kokkos::HostSpace>; - - const stk::mesh::BulkData& mesh = source.get_mesh(); - const stk::mesh::BucketVector& bv = mesh.buckets(stk::topology::NODE_RANK); - - for (auto it : bv) { - const stk::mesh::Bucket& bucket = *it; - const int num_nodes_in_bucket = bucket.size(); - const int num_source_components = stk::mesh::field_scalars_per_entity(target, bucket); - const int num_target_components = stk::mesh::field_scalars_per_entity(target, bucket); - - const int uneven_downsampling = num_source_components % num_target_components; - TEUCHOS_TEST_FOR_EXCEPTION(uneven_downsampling, std::logic_error, - "Error in stk fields: specification of coordinate vector vs. solution layout is incorrect.\n"); - - auto src_stk_data = stk::mesh::field_data(source,bucket); - auto tgt_stk_data = stk::mesh::field_data(target,bucket); - - SrcViewT src_view (src_stk_data,num_nodes_in_bucket,num_source_components); - TgtViewT tgt_view (tgt_stk_data,num_nodes_in_bucket,num_target_components); - - for(int i=0; i -void STKFieldContainerHelper:: -saveVector (const Thyra_Vector& field_thyra, - FieldType& field_stk, - const stk::mesh::BulkData& bulkData, - const Teuchos::RCP& dof_mgr, - const bool overlapped) -{ - std::vector components(dof_mgr->getNumFields()); - std::iota(components.begin(),components.end(),0); - saveVector(field_thyra,field_stk,bulkData,dof_mgr,overlapped,components); -} - - -} // namespace Albany From 3c2f2707c1b726b5cd377eec9e701cb6cccf31dd Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Mon, 27 Nov 2023 17:44:20 -0700 Subject: [PATCH 04/12] Allow to not save solution field in output mesh This is so far only useful for the PopulateMesh problem, where setting the solution field in the mesh would cause problems when loading the mesh later on in another problem. That is because STK forces redeclarations of the same field to have a compatible layout, so we would only be able to use the populated mesh for a problem that has the same number of eqns as we declared in the PopulateMesh problem. --- .../stk/Albany_GenericSTKFieldContainer.cpp | 4 +- .../stk/Albany_GenericSTKFieldContainer.hpp | 2 + src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 1 + .../stk/Albany_MultiSTKFieldContainer.cpp | 162 +++++++++--------- .../stk/Albany_OrdinarySTKFieldContainer.cpp | 61 ++++--- .../AsciiMeshes/Humboldt/humboldt_2d.exo | Bin 110468 -> 99252 bytes .../Humboldt/humboldt_contiguous_2d.exo | Bin 110468 -> 99232 bytes tests/landIce/ExoMeshes/square_quad.exo | Bin 8172 -> 8308 bytes .../FO_GIS/input_fo_gis_populate_meshes.yaml | 2 + 9 files changed, 124 insertions(+), 108 deletions(-) diff --git a/src/disc/stk/Albany_GenericSTKFieldContainer.cpp b/src/disc/stk/Albany_GenericSTKFieldContainer.cpp index 7eeba2e570..d54aab1d1b 100644 --- a/src/disc/stk/Albany_GenericSTKFieldContainer.cpp +++ b/src/disc/stk/Albany_GenericSTKFieldContainer.cpp @@ -47,7 +47,9 @@ GenericSTKFieldContainer::GenericSTKFieldContainer( params(params_), neq(neq_), numDim(numDim_), - num_params(num_params_) { + num_params(num_params_) +{ + save_solution_field = params_->get("Save Solution Field", true); } #ifdef ALBANY_SEACAS diff --git a/src/disc/stk/Albany_GenericSTKFieldContainer.hpp b/src/disc/stk/Albany_GenericSTKFieldContainer.hpp index 932092e072..a9749cc959 100644 --- a/src/disc/stk/Albany_GenericSTKFieldContainer.hpp +++ b/src/disc/stk/Albany_GenericSTKFieldContainer.hpp @@ -60,6 +60,8 @@ class GenericSTKFieldContainer : public AbstractSTKFieldContainer int neq; int numDim; int num_params{0}; + + bool save_solution_field = false; }; } // namespace Albany diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index d9dd678de1..b3fc59fe6d 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -1479,6 +1479,7 @@ GenericSTKMeshStruct::getValidGenericSTKParameters(std::string listname) const validPL->set>("Betas BL Transform", Teuchos::tuple(0.0, 0.0, 0.0), "Beta parameters for Tanh Boundary Layer transform type"); validPL->set("Contiguous IDs", "true", "Tells Ascii mesh reader is mesh has contiguous global IDs on 1 processor."); //for LandIce problem that require transformation of STK mesh + validPL->set("Save Solution Field", "true", "Whether the solution field should be saved in the output mesh"); Teuchos::Array defaultFields; validPL->set >("Restart Fields", defaultFields, diff --git a/src/disc/stk/Albany_MultiSTKFieldContainer.cpp b/src/disc/stk/Albany_MultiSTKFieldContainer.cpp index ec0dfc0c3a..208c3a84dd 100644 --- a/src/disc/stk/Albany_MultiSTKFieldContainer.cpp +++ b/src/disc/stk/Albany_MultiSTKFieldContainer.cpp @@ -101,106 +101,108 @@ MultiSTKFieldContainer::MultiSTKFieldContainer( { typedef typename AbstractSTKFieldContainer::STKFieldType SFT; - sol_vector_name.resize(solution_vector.size()); - sol_index.resize(solution_vector.size()); - - // Check the input - - auto const num_derivs = solution_vector[0].size(); - for (auto i = 1; i < solution_vector.size(); ++i) { - ALBANY_ASSERT( - solution_vector[i].size() == num_derivs, - "\n*** ERROR ***\n" - "Number of derivatives for each variable is different.\n" - "Check definition of solution vector and its derivatives.\n"); - } + if (save_solution_field) { + sol_vector_name.resize(solution_vector.size()); + sol_index.resize(solution_vector.size()); + + // Check the input + + auto const num_derivs = solution_vector[0].size(); + for (auto i = 1; i < solution_vector.size(); ++i) { + ALBANY_ASSERT( + solution_vector[i].size() == num_derivs, + "\n*** ERROR ***\n" + "Number of derivatives for each variable is different.\n" + "Check definition of solution vector and its derivatives.\n"); + } - for (int vec_num = 0; vec_num < solution_vector.size(); vec_num++) { - if (solution_vector[vec_num].size() == - 0) { // Do the default solution vector + for (int vec_num = 0; vec_num < solution_vector.size(); vec_num++) { + if (solution_vector[vec_num].size() == + 0) { // Do the default solution vector - std::string name = params_->get( - sol_tag_name[vec_num], sol_id_name[vec_num]); - SFT* solution = - &metaData_->declare_field(stk::topology::NODE_RANK, name); - stk::mesh::put_field_on_mesh( - *solution, metaData_->universal_part(), neq_, nullptr); + std::string name = params_->get( + sol_tag_name[vec_num], sol_id_name[vec_num]); + SFT* solution = + &metaData_->declare_field(stk::topology::NODE_RANK, name); + stk::mesh::put_field_on_mesh( + *solution, metaData_->universal_part(), neq_, nullptr); #ifdef ALBANY_SEACAS - stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); + stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); #endif - sol_vector_name[vec_num].push_back(name); - sol_index[vec_num].push_back(this->neq); - } else if (solution_vector[vec_num].size() == 1) { // User is just renaming - // the entire solution - // vector + sol_vector_name[vec_num].push_back(name); + sol_index[vec_num].push_back(this->neq); + } else if (solution_vector[vec_num].size() == 1) { // User is just renaming + // the entire solution + // vector - SFT* solution = &metaData_->declare_field( - stk::topology::NODE_RANK, solution_vector[vec_num][0]); - stk::mesh::put_field_on_mesh( - *solution, metaData_->universal_part(), neq_, nullptr); + SFT* solution = &metaData_->declare_field( + stk::topology::NODE_RANK, solution_vector[vec_num][0]); + stk::mesh::put_field_on_mesh( + *solution, metaData_->universal_part(), neq_, nullptr); #ifdef ALBANY_SEACAS - stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); + stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); #endif - sol_vector_name[vec_num].push_back(solution_vector[vec_num][0]); - sol_index[vec_num].push_back(neq_); + sol_vector_name[vec_num].push_back(solution_vector[vec_num][0]); + sol_index[vec_num].push_back(neq_); - } else { // user is breaking up the solution into multiple fields + } else { // user is breaking up the solution into multiple fields - // make sure the number of entries is even + // make sure the number of entries is even - TEUCHOS_TEST_FOR_EXCEPTION( - (solution_vector[vec_num].size() % 2), - std::logic_error, - "Error in input file: specification of solution vector layout is " - "incorrect." - << std::endl); + TEUCHOS_TEST_FOR_EXCEPTION( + (solution_vector[vec_num].size() % 2), + std::logic_error, + "Error in input file: specification of solution vector layout is " + "incorrect." + << std::endl); - int len, accum = 0; + int len, accum = 0; - for (int i = 0; i < solution_vector[vec_num].size(); i += 2) { - if (solution_vector[vec_num][i + 1] == "V") { - len = numDim_; // vector - accum += len; - SFT* solution = &metaData_->declare_field( - stk::topology::NODE_RANK, solution_vector[vec_num][i]); - stk::mesh::put_field_on_mesh( - *solution, metaData_->universal_part(), len, nullptr); + for (int i = 0; i < solution_vector[vec_num].size(); i += 2) { + if (solution_vector[vec_num][i + 1] == "V") { + len = numDim_; // vector + accum += len; + SFT* solution = &metaData_->declare_field( + stk::topology::NODE_RANK, solution_vector[vec_num][i]); + stk::mesh::put_field_on_mesh( + *solution, metaData_->universal_part(), len, nullptr); #ifdef ALBANY_SEACAS - stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); + stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); #endif - sol_vector_name[vec_num].push_back(solution_vector[vec_num][i]); - sol_index[vec_num].push_back(len); - - } else if (solution_vector[vec_num][i + 1] == "S") { - len = 1; // scalar - accum += len; - SFT* solution = &metaData_->declare_field( - stk::topology::NODE_RANK, solution_vector[vec_num][i]); - stk::mesh::put_field_on_mesh( - *solution, metaData_->universal_part(), nullptr); + sol_vector_name[vec_num].push_back(solution_vector[vec_num][i]); + sol_index[vec_num].push_back(len); + + } else if (solution_vector[vec_num][i + 1] == "S") { + len = 1; // scalar + accum += len; + SFT* solution = &metaData_->declare_field( + stk::topology::NODE_RANK, solution_vector[vec_num][i]); + stk::mesh::put_field_on_mesh( + *solution, metaData_->universal_part(), nullptr); #ifdef ALBANY_SEACAS - stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); + stk::io::set_field_role(*solution, Ioss::Field::TRANSIENT); #endif - sol_vector_name[vec_num].push_back(solution_vector[vec_num][i]); - sol_index[vec_num].push_back(len); - - } else { - TEUCHOS_TEST_FOR_EXCEPTION( - true, - std::logic_error, - "Error in input file: specification of solution vector layout is " - "incorrect." - << std::endl); + sol_vector_name[vec_num].push_back(solution_vector[vec_num][i]); + sol_index[vec_num].push_back(len); + + } else { + TEUCHOS_TEST_FOR_EXCEPTION( + true, + std::logic_error, + "Error in input file: specification of solution vector layout is " + "incorrect." + << std::endl); + } } + TEUCHOS_TEST_FOR_EXCEPTION( + accum != neq_, + std::logic_error, + "Error in input file: specification of solution vector layout is " + "incorrect." + << std::endl); } - TEUCHOS_TEST_FOR_EXCEPTION( - accum != neq_, - std::logic_error, - "Error in input file: specification of solution vector layout is " - "incorrect." - << std::endl); } } diff --git a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp index 6d29bcd21e..ef7cb58cef 100644 --- a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp +++ b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp @@ -138,40 +138,41 @@ OrdinarySTKFieldContainer::OrdinarySTKFieldContainer( sol_sens_id_name_vec[0] = "sensitivity dg" + std::to_string(resp_fn_index) + "dp" + std::to_string(param_sens_index); } - solution_field.resize(num_time_deriv + 1); - solution_field_dtk.resize(num_time_deriv + 1); - solution_field_dxdp.resize(this->num_params); - - for (int num_vecs = 0; num_vecs <= num_time_deriv; num_vecs++) { - solution_field[num_vecs] = &metaData_->declare_field( - stk::topology::NODE_RANK, - params_->get( - sol_tag_name[num_vecs], sol_id_name[num_vecs])); - stk::mesh::put_field_on_mesh( - *solution_field[num_vecs], metaData_->universal_part(), neq_, nullptr); // KL: this + if (save_solution_field) { + solution_field.resize(num_time_deriv + 1); + solution_field_dtk.resize(num_time_deriv + 1); + solution_field_dxdp.resize(this->num_params); -#if defined(ALBANY_DTK) - if (output_dtk_field == true) { - solution_field_dtk[num_vecs] = &metaData_->declare_field( + for (int num_vecs = 0; num_vecs <= num_time_deriv; num_vecs++) { + solution_field[num_vecs] = &metaData_->declare_field( stk::topology::NODE_RANK, params_->get( - sol_dtk_tag_name[num_vecs], sol_dtk_id_name[num_vecs])); + sol_tag_name[num_vecs], sol_id_name[num_vecs])); stk::mesh::put_field_on_mesh( - *solution_field_dtk[num_vecs], - metaData_->universal_part(), - neq_, - nullptr); - } + *solution_field[num_vecs], metaData_->universal_part(), neq_, nullptr); // KL: this +#if defined(ALBANY_DTK) + if (output_dtk_field == true) { + solution_field_dtk[num_vecs] = &metaData_->declare_field( + stk::topology::NODE_RANK, + params_->get( + sol_dtk_tag_name[num_vecs], sol_dtk_id_name[num_vecs])); + stk::mesh::put_field_on_mesh( + *solution_field_dtk[num_vecs], + metaData_->universal_part(), + neq_, + nullptr); + } #endif #ifdef ALBANY_SEACAS - stk::io::set_field_role(*solution_field[num_vecs], Ioss::Field::TRANSIENT); + stk::io::set_field_role(*solution_field[num_vecs], Ioss::Field::TRANSIENT); #if defined(ALBANY_DTK) - if (output_dtk_field == true) - stk::io::set_field_role( - *solution_field_dtk[num_vecs], Ioss::Field::TRANSIENT); + if (output_dtk_field == true) + stk::io::set_field_role( + *solution_field_dtk[num_vecs], Ioss::Field::TRANSIENT); #endif #endif + } } //Transient sensitivities output to Exodus @@ -260,7 +261,9 @@ saveSolnVector (const Thyra_Vector& soln, const dof_mgr_ptr_t& sol_dof_mgr, const bool overlapped) { - saveVectorImpl (soln, solution_field[0]->name(), sol_dof_mgr, overlapped); + if (save_solution_field) { + saveVectorImpl (soln, solution_field[0]->name(), sol_dof_mgr, overlapped); + } if (soln_dxdp != Teuchos::null and output_sens_field) { TEUCHOS_TEST_FOR_EXCEPTION( @@ -283,7 +286,9 @@ saveSolnVector (const Thyra_Vector& soln, const bool overlapped) { saveSolnVector(soln,soln_dxdp, sol_dof_mgr, overlapped); - saveVectorImpl (soln_dot, solution_field[1]->name(), sol_dof_mgr, overlapped); + if (save_solution_field) { + saveVectorImpl (soln_dot, solution_field[1]->name(), sol_dof_mgr, overlapped); + } } void OrdinarySTKFieldContainer:: @@ -295,7 +300,9 @@ saveSolnVector (const Thyra_Vector& soln, const bool overlapped) { saveSolnVector(soln, soln_dxdp, soln_dot, sol_dof_mgr, overlapped); - saveVectorImpl (soln_dotdot, solution_field[2]->name(), sol_dof_mgr, overlapped); + if (save_solution_field) { + saveVectorImpl (soln_dotdot, solution_field[2]->name(), sol_dof_mgr, overlapped); + } } void OrdinarySTKFieldContainer:: diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo b/tests/landIce/AsciiMeshes/Humboldt/humboldt_2d.exo index f711eb5ee6b9e0cae8e074057c0deb7236aab354..54cd77b3e3612e3b9aa613283b84381704aebc5e 100644 GIT binary patch delta 1831 zcmbVMJ!~6g7{1r%pYt^#ab2e=snAz}Do50=&kk*52~z5)R2c|?fgnY)9p9JQvVCWK zm!CF?94V1NVj=yIGL#`>r7#pZ(hX%m2#E>?KwVf63j+f~B^Wv|@V<9B<5bPUCw)Kf z&pq$|?fe!#{3twJn7$E^BnfbK#-k(NlPG`LYT%1w^%3%H{sH%y&d zNJvs>S7c!7f=XQ8C@wbYE}I|~kH-;8&4~s~?Y_l!ACKwT`XnXWNLTuA@%EY{V0?zIzr^ium=7ZI=HB2(~^{B~iMZpuQ*;5Js0&9->EjOnr13U6CA z(_j~11Gz?y`HGGqCS|Ap}R{|;%!{M_XVp1vnMf9{s?Cjtju9#+9UvoLsB|%T- zo?%J4^sz_pJi^=4b<6EG=?S`DzJt1hI`&3!NqirUoeOyw?%9X=>o0;u#?B$9x9}Z& z>QbPV#8zZXi}Yk@A7k`75r*cGukb~86sTh^b}Z?(-9CC8lraXvUc z2C+Ypj-t%6%l7h7yL<8{azcjK6LDWo6(IJvi_zdX8Y#%qvgPAU5C?aEx=|MZBBGL?b! zQKz?p;&VAV2KoYW6a$A4N8I;+2zm0|5W0V7|47_lnIZ92aC{in$xIYK^(rHN4v&a? zLG@)=C;!wB%Y9k#+IkrIG2EvSy8!Fc_*A?fSuZswRBYYtkR#n=6}!=)4EZpA7Eh?y z)&p1fc(ifk$zq?v-Oe1z`@@Zkg%CF4_Gc)IT7I}l;G(R?MJAL$`98i?_aD4kH5>HH z_vB|pNgfGof6+ZW(C>)W!Sz7!n{Mgd;SZcr9i9fARvrHMU*}H&aenSqfbPxYk4Zo5V%<4xEMbRR|YNV~;$h&R<21&>z5wYiA%a1|cNd-v90z&Y4}BslMFp)K*xoKE7s?b~q1 H`-A)oRjYqX delta 3032 zcmeHHO-vI}5Z)=>vRhg$AX^N^fEva46BHFS#2-Y0o~Q?diOF_p*U;GR7Ph4-Y8z}K zi5Hu9*oy}|n3#|l3?zHyNa8_mo{Szmc=X_b12N9L?c&;tR}Y2!a5}VPu7k!w~C)-cwRmH&jE*>A2g6+-ekaYC4lcRiFsDkjd$)RnYUa zgH%h#qY{Ditd6MgU~MJN2BDjkp}W>OP%91BJ`L|}BZOh5)j4gJqNs2LSz29zPAIpb z+KU{X(bQQzWzME8v;?7rOBYVnJtDp88uBQvk&JQA^hJ`NVuLP*OWc!&U0dG3HOxCH zO`BPr{gUMytv+lBb&1=s@DtYv9$ih`&VkesWRsy2JwpFD8nQlx zccm4IZaeOMvn!#lxRBU`ehK~gSu=kMb;=oL+v3q4A<Ii=U8iI)Ik?)cdNwzM>*^s<@KOY-H z65mir*55@URHRIUMN0fYK?r{l@--Go6B_Z`C_*U{r~iO&G~O~!<@h4^2)B|u*oTeS z4!+?7KmE>L2IFUGsEwuTLtD5f!hC$S+w-~FmDuL;5Y(nhO>XYFaF)+BrHMpO|)eAg> zIt8{PdxWLoJU1XeiEA{Su?p%vEmcqrivo~%3|kTvW#%QC5`C(wwbMxl`zk3)fsm4w z!H3@9+EwEH*P~9eO<7UEO%3zYz9{Z0d#=Z?e6_ru_fVBO;n4#XuEUc}T)pD|z*Z&@ z8=cd#__EwT3XKGbhSn;SF%dUi;TysNJ+KJ9MlTR;3hF|pmqCw{?kcQ~WwP1ZTDGX8 zqy81L3JhPWmQ{ zDyv^VFCKT^CgE`a)vcg&CR4GReqCIA2c diff --git a/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo b/tests/landIce/AsciiMeshes/Humboldt/humboldt_contiguous_2d.exo index 04cc157625464c6da9e51b8742728c0a4889aa8e..e11b53570d1608132ca8187b5c15286fcaf0945a 100644 GIT binary patch delta 1799 zcmbVMO>7%Q6yDkO&wAq!yN=VAL};o?RU&HFc1(yYAf=8<6d^+307#YA8}B5xZ0{QH zI!WtPwvP^`FkRTKn)04YGpTVysHHrfqUuQq@e5R~i8Pz|lYV1EuMg1BMo z%mPLbg8Mu}7S1UsWp#C}UUS80QubsFOewRxP8Rmxq5F@{>?iWsQG~3j&Qy!po*_Yk zBN4mW0GZ92t`&ER!mRY~lLYC8D^<%jTh~#JcYFL1)9JEi(Cq6pJ6Fif6|xzc%jEI} zYLsghO%-Wsg{HP?YLjkibqnvUZfdP8t+X3!W?i?{vT4}Wjkejg)SRAX+vW*SSNV^> z*9x<_VVD;O%9W=r38CD;*Yz#kz&xcIrp>>a}D z>AIzL8}b<4AKn1nQ62g~UFW}q;%9@tLA3GQ=HvUEh9}R0WH4YKc;<3Md6)OXliBb9 zbI*!i*O4)dL1t@i+hccPTr!ZvOM&ER636=@-fWpo%#Pdbd@3+AN#ef)9|6p=HM@P( z+8+M5l$1#P5B{x`Dw6mU*G8SeJFt8k_z3+0@k{6jtQWq6S!SMY4kbV%oXQi+Z4u$8?}Ymk~_D%Lq1(tV*~SG$!V$j{<273ySKg9^E82#r}gx zK^B$E&Y25jal(08Av>b;ag)pwPr^&9U+|Gr(Qym{2d<=T)C_aW;BPB0a~3J{%d27M k$1U=`bo6WSTf1_P{>>XH`e|_U?5u?)@770_-<>R{#J2 delta 2654 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 Hhjae|{$FLu diff --git a/tests/landIce/FO_GIS/input_fo_gis_populate_meshes.yaml b/tests/landIce/FO_GIS/input_fo_gis_populate_meshes.yaml index d7a81667d7..5adaa68770 100644 --- a/tests/landIce/FO_GIS/input_fo_gis_populate_meshes.yaml +++ b/tests/landIce/FO_GIS/input_fo_gis_populate_meshes.yaml @@ -20,6 +20,7 @@ ANONYMOUS: Method: Ioss Number Of Time Derivatives: 0 Use Serial Mesh: false + Save Solution Field: false Exodus Input File Name: ../ExoMeshes/gis_unstruct_2d.exo Exodus Output File Name: gis_unstruct_basal_populated.exo Required Fields Info: @@ -48,6 +49,7 @@ ANONYMOUS: upperside: Method: SideSetSTK Number Of Time Derivatives: 0 + Save Solution Field: false Exodus Output File Name: gis_unstruct_surface_populated.exo Required Fields Info: Number Of Fields: 2 From a2bda33b30c83aa3959e86961d0c6354cca63929 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 9 Nov 2023 09:34:09 -0700 Subject: [PATCH 05/12] Simplified interface of setFieldData and setBulkData * No need to pass workset size to setFieldData or setBulkData, since it can be retrieved from the mesh specs * No need to pass states to setBulkData, since they are already set in setFieldData --- src/disc/Albany_AbstractMeshStruct.hpp | 16 +------ src/disc/Albany_DiscretizationFactory.cpp | 24 +++------- src/disc/Albany_DiscretizationFactory.hpp | 11 +---- src/disc/omegah/Albany_OmegahBoxMesh.hpp | 5 +-- src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp | 10 ++--- src/disc/omegah/Albany_OmegahGenericMesh.cpp | 1 - src/disc/omegah/Albany_OmegahGenericMesh.hpp | 1 - src/disc/omegah/Albany_OmegahOshMesh.hpp | 5 +-- src/disc/stk/Albany_AsciiSTKMesh2D.cpp | 10 ++--- src/disc/stk/Albany_AsciiSTKMesh2D.hpp | 6 +-- src/disc/stk/Albany_AsciiSTKMeshStruct.cpp | 12 ++--- src/disc/stk/Albany_AsciiSTKMeshStruct.hpp | 6 +-- src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 31 +++---------- src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp | 6 +-- src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 45 +++++++------------ src/disc/stk/Albany_GenericSTKMeshStruct.hpp | 19 +++----- src/disc/stk/Albany_GmshSTKMeshStruct.cpp | 13 +++--- src/disc/stk/Albany_GmshSTKMeshStruct.hpp | 6 +-- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 10 ++--- src/disc/stk/Albany_IossSTKMeshStruct.hpp | 6 +-- src/disc/stk/Albany_STK3DPointStruct.cpp | 12 ++--- src/disc/stk/Albany_STK3DPointStruct.hpp | 6 +-- src/disc/stk/Albany_SideSetSTKMeshStruct.cpp | 8 +--- src/disc/stk/Albany_SideSetSTKMeshStruct.hpp | 5 +-- src/disc/stk/Albany_TmplSTKMeshStruct.hpp | 12 +---- src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp | 23 +++------- 26 files changed, 81 insertions(+), 228 deletions(-) diff --git a/src/disc/Albany_AbstractMeshStruct.hpp b/src/disc/Albany_AbstractMeshStruct.hpp index 1585f672d2..80534cf27d 100644 --- a/src/disc/Albany_AbstractMeshStruct.hpp +++ b/src/disc/Albany_AbstractMeshStruct.hpp @@ -38,21 +38,9 @@ struct AbstractMeshStruct { virtual void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}) = 0; - virtual void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}) = 0; - - void setFieldAndBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}) - { - setFieldData(comm, sis, worksetSize, side_set_sis); - setBulkData(comm, sis, worksetSize, side_set_sis); - } + + virtual void setBulkData(const Teuchos::RCP& comm) = 0; Teuchos::RCP > global_cell_layers_data; Teuchos::RCP > local_cell_layers_data; diff --git a/src/disc/Albany_DiscretizationFactory.cpp b/src/disc/Albany_DiscretizationFactory.cpp index bae96efde9..ebe9523c32 100644 --- a/src/disc/Albany_DiscretizationFactory.cpp +++ b/src/disc/Albany_DiscretizationFactory.cpp @@ -102,8 +102,8 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis Teuchos::RCP meshStruct2D; meshStruct2D = Teuchos::rcp(new AsciiSTKMesh2D(disc_params, comm, numParams)); Teuchos::RCP sis = Teuchos::rcp(new StateInfoStruct); - meshStruct2D->setFieldAndBulkData(comm, - sis, meshStruct2D->meshSpecs[0]->worksetSize); + meshStruct2D->setFieldData(comm, sis); + meshStruct2D->setBulkData(comm); Ioss::Init::Initializer io; Teuchos::RCP mesh_data = Teuchos::rcp(new stk::io::StkMeshIoBroker(MPI_COMM_WORLD)); mesh_data->set_bulk_data(*meshStruct2D->bulkData); @@ -184,7 +184,7 @@ DiscretizationFactory::createDiscretization( setFieldData(it.second,{}); } } - setMeshStructBulkData(sis, side_set_sis); + setMeshStructBulkData(); completeDiscSetup(result); return result; @@ -208,24 +208,14 @@ DiscretizationFactory::setMeshStructFieldData( const std::map >& side_set_sis) { TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructFieldData"); - meshStruct->setFieldData(comm, sis, - meshStruct->meshSpecs[0]->worksetSize, side_set_sis); + meshStruct->setFieldData(comm, sis, side_set_sis); } -void -DiscretizationFactory::setMeshStructBulkData( - const Teuchos::RCP& sis) { - setMeshStructBulkData(sis, empty_side_set_sis); -} - -void -DiscretizationFactory::setMeshStructBulkData( - const Teuchos::RCP& sis, - const std::map >& side_set_sis) +void DiscretizationFactory:: +setMeshStructBulkData() { TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructBulkData"); - meshStruct->setBulkData(comm, sis, - meshStruct->meshSpecs[0]->worksetSize, side_set_sis); + meshStruct->setBulkData(comm); } diff --git a/src/disc/Albany_DiscretizationFactory.hpp b/src/disc/Albany_DiscretizationFactory.hpp index 968e4ed75b..29ad2f1537 100644 --- a/src/disc/Albany_DiscretizationFactory.hpp +++ b/src/disc/Albany_DiscretizationFactory.hpp @@ -56,19 +56,12 @@ class DiscretizationFactory { setMeshStructFieldData( const Teuchos::RCP& sis); - void + void setMeshStructFieldData( const Teuchos::RCP& sis, const std::map >& side_set_sis); - void - setMeshStructBulkData( - const Teuchos::RCP& sis); - - void - setMeshStructBulkData( - const Teuchos::RCP& sis, - const std::map >& side_set_sis); + void setMeshStructBulkData(); Teuchos::RCP createDiscretizationFromInternalMeshStruct( const int neq, diff --git a/src/disc/omegah/Albany_OmegahBoxMesh.hpp b/src/disc/omegah/Albany_OmegahBoxMesh.hpp index 4c90db0982..4d06e20e07 100644 --- a/src/disc/omegah/Albany_OmegahBoxMesh.hpp +++ b/src/disc/omegah/Albany_OmegahBoxMesh.hpp @@ -13,10 +13,7 @@ class OmegahBoxMesh : public OmegahGenericMesh { OmegahBoxMesh (const Teuchos::RCP& params, const Teuchos::RCP& comm, const int numParams); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) override; + void setBulkData (const Teuchos::RCP& comm) override; Omega_h::Read create_ns_tag (const std::string& name, diff --git a/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp b/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp index 675e9bcb28..fac497cd38 100644 --- a/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp +++ b/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp @@ -142,14 +142,10 @@ create_ns_tag (const std::string& name, } template -void OmegahBoxMesh::setBulkData( - const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void OmegahBoxMesh:: +setBulkData (const Teuchos::RCP& /* comm */) { - // We can finally extract the side set meshes and set the fields and bulk data in all of them - // this->setSideSetBulkData(comm, side_set_sis, worksetSize); + // Nothing to do here } template diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.cpp b/src/disc/omegah/Albany_OmegahGenericMesh.cpp index c41edd79d2..9d203ca6d1 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.cpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.cpp @@ -7,7 +7,6 @@ namespace Albany void OmegahGenericMesh:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) { m_field_accessor = Teuchos::rcp(new OmegahMeshFieldAccessor(m_mesh)); diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.hpp b/src/disc/omegah/Albany_OmegahGenericMesh.hpp index 36b794eddb..dc94e07f4a 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.hpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.hpp @@ -20,7 +20,6 @@ class OmegahGenericMesh : public AbstractMeshStruct { void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) override; // ------------- Omegah specific methods -------------- // diff --git a/src/disc/omegah/Albany_OmegahOshMesh.hpp b/src/disc/omegah/Albany_OmegahOshMesh.hpp index 8f624523b0..8ad4f11482 100644 --- a/src/disc/omegah/Albany_OmegahOshMesh.hpp +++ b/src/disc/omegah/Albany_OmegahOshMesh.hpp @@ -11,10 +11,7 @@ class OmegahOshMesh : public OmegahGenericMesh OmegahOshMesh (const Teuchos::RCP& params, const Teuchos::RCP& comm, const int numParams); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) override + void setBulkData (const Teuchos::RCP& comm) { throw NotYetImplemented("OmegahOshMesh::setBulkData"); } diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp index f7bc90ac53..47de5ae9e6 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp @@ -302,17 +302,13 @@ AsciiSTKMesh2D (const Teuchos::RCP& params, void AsciiSTKMesh2D:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& /* side_set_sis */) { - this->SetupFieldData(commT, sis, worksetSize); + this->SetupFieldData(comm, sis); } void AsciiSTKMesh2D:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +setBulkData (const Teuchos::RCP& comm) { metaData->commit(); @@ -442,7 +438,7 @@ setBulkData (const Teuchos::RCP& comm, this->loadRequiredInputFields (comm); // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetFieldAndBulkData(comm, side_set_sis, worksetSize); + this->setSideSetBulkData(comm); fieldAndBulkDataSet = true; } diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.hpp b/src/disc/stk/Albany_AsciiSTKMesh2D.hpp index 60b7322be5..1d3064fef7 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.hpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.hpp @@ -61,13 +61,9 @@ namespace Albany { void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp index 02dc8ca1c8..def6148d09 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp @@ -419,18 +419,14 @@ void AsciiSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) { - this->SetupFieldData(comm, sis, worksetSize); - this->setSideSetFieldData(comm, side_set_sis, worksetSize); + this->SetupFieldData(comm, sis); + this->setSideSetFieldData(comm, side_set_sis); } void AsciiSTKMeshStruct:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +setBulkData (const Teuchos::RCP& comm) { metaData->commit(); @@ -720,7 +716,7 @@ setBulkData (const Teuchos::RCP& comm, bulkData->modification_end(); fieldAndBulkDataSet = true; - this->setSideSetFieldAndBulkData(comm, side_set_sis, worksetSize); + this->setSideSetBulkData(comm); } Teuchos::RCP diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp index 17e5be0dac..f0b7f69f2b 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp @@ -27,13 +27,9 @@ class AsciiSTKMeshStruct : public GenericSTKMeshStruct void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 3ab48f9443..1a66e72194 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -195,41 +195,24 @@ ExtrudedSTKMeshStruct(const Teuchos::RCP& params, void ExtrudedSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) { - out->setProcRankAndSize(comm->getRank(), comm->getSize()); - out->setOutputToRootOnly(0); - - // Finish to set up the basal mesh - Teuchos::RCP dummy_sis = Teuchos::rcp(new StateInfoStruct()); - auto it_sis = side_set_sis.find("basalside"); - auto& basal_sis = (it_sis==side_set_sis.end() ? dummy_sis : it_sis->second); - - this->sideSetMeshStructs.at("basalside")->setFieldData (comm, basal_sis, worksetSize); - // Setting up the field container - this->SetupFieldData(comm, sis, worksetSize); + this->SetupFieldData(comm, sis); - this->setSideSetFieldData(comm, side_set_sis, worksetSize); + // Set side meshes fields + this->setSideSetFieldData(comm, side_set_sis); } void ExtrudedSTKMeshStruct:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +setBulkData (const Teuchos::RCP& comm) { constexpr auto ELEM_RANK = stk::topology::ELEM_RANK; constexpr auto NODE_RANK = stk::topology::NODE_RANK; const auto SIDE_RANK = metaData->side_rank(); - // Finish to set up the basal mesh - Teuchos::RCP dummy_sis = Teuchos::rcp(new StateInfoStruct()); - auto it_sis = side_set_sis.find("basalside"); - auto& basal_sis = (it_sis==side_set_sis.end() ? dummy_sis : it_sis->second); - - this->sideSetMeshStructs.at("basalside")->setBulkData (comm, basal_sis, worksetSize); + // Finish to set up the basal mesh (we need this to be completed before building 3d entities) + this->sideSetMeshStructs.at("basalside")->setBulkData (comm); constexpr auto LAYER = LayeredMeshOrdering::LAYER; @@ -598,7 +581,7 @@ setBulkData (const Teuchos::RCP& comm, this->checkNodeSetsFromSideSetsIntegrity (); // We can finally extract the side set meshes and set the fields and bulk data in all of them - this->setSideSetBulkData(comm, side_set_sis, worksetSize); + this->setSideSetBulkData(comm); if (params->get("Export 2D Data",false)) { // We export the basal mesh in GMSH format diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp index 01a58ae7ee..6c81329cc8 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp @@ -28,13 +28,9 @@ class ExtrudedSTKMeshStruct : public GenericSTKMeshStruct void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); // empty map as default - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); // empty map as default + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const { return false; } diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index b3fc59fe6d..8f22e24abe 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -77,15 +77,12 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( fieldAndBulkDataSet = false; } -void GenericSTKMeshStruct::SetupFieldData( - const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const int worksetSize) +void GenericSTKMeshStruct:: +SetupFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis) { - TEUCHOS_TEST_FOR_EXCEPTION(!metaData->is_initialized(), - std::logic_error, - "LogicError: metaData->FEM_initialize(numDim) not yet called" << std::endl); - + TEUCHOS_TEST_FOR_EXCEPTION(!metaData->is_initialized(), std::logic_error, + "[GenericSTKMeshStruct::SetupFieldData] metaData->initialize(numDim) not yet called" << std::endl); if (bulkData.is_null()) { auto mpiComm = getMpiCommFromTeuchosComm(comm); @@ -95,7 +92,7 @@ void GenericSTKMeshStruct::SetupFieldData( else meshBuilder.set_aura_option(stk::mesh::BulkData::NO_AUTO_AURA); - meshBuilder.set_bucket_capacity(worksetSize); + meshBuilder.set_bucket_capacity(meshSpecs[0]->worksetSize); meshBuilder.set_add_fmwk_data(false); std::unique_ptr bulkDataPtr = meshBuilder.create(Teuchos::get_shared_ptr(metaData)); bulkData = Teuchos::rcp(bulkDataPtr.release()); @@ -540,21 +537,17 @@ void GenericSTKMeshStruct::initializeSideSetMeshStructs (const Teuchos::RCP& comm, - const std::map >& side_set_sis, - int worksetSize) +void GenericSTKMeshStruct:: +setSideSetFieldData (const Teuchos::RCP& comm, + const std::map >& side_set_sis) { if (this->sideSetMeshStructs.size()>0) { // Dummy sis if not present in the maps for a given side set. // This could happen if the side discretization has no states - Teuchos::RCP dummy_sis = Teuchos::rcp(new StateInfoStruct()); + auto dummy_sis = Teuchos::rcp(new StateInfoStruct()); - Teuchos::RCP params_ss; - const Teuchos::ParameterList& ssd_list = params->sublist("Side Set Discretizations"); for (auto it : sideSetMeshStructs) { - Teuchos::RCP sideMesh; - sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); + auto sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); if (sideMesh!=Teuchos::null) { // SideSetSTK mesh need to build the mesh sideMesh->setParentMeshInfo(*this, it.first); @@ -566,28 +559,21 @@ void GenericSTKMeshStruct::setSideSetFieldData ( auto& sis = (it_sis==side_set_sis.end() ? dummy_sis : it_sis->second); - params_ss = Teuchos::rcp(new Teuchos::ParameterList(ssd_list.sublist(it.first))); - it.second->setFieldData(comm,sis,worksetSize); // Cell equations are also defined on the side, but not vice-versa + it.second->setFieldData(comm,sis); // Cell equations are also defined on the side, but not vice-versa } } } } -void GenericSTKMeshStruct::setSideSetBulkData ( - const Teuchos::RCP& comm, - const std::map >& side_set_sis, - int worksetSize) +void GenericSTKMeshStruct:: { if (this->sideSetMeshStructs.size()>0) { // Dummy sis if not present in the maps for a given side set. // This could happen if the side discretization has no states Teuchos::RCP dummy_sis = Teuchos::rcp(new StateInfoStruct()); - Teuchos::RCP params_ss; - const Teuchos::ParameterList& ssd_list = params->sublist("Side Set Discretizations"); for (auto it : sideSetMeshStructs) { - Teuchos::RCP sideMesh; - sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); + auto sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); if (sideMesh!=Teuchos::null) { // SideSetSTK mesh need to build the mesh sideMesh->setParentMeshInfo(*this, it.first); @@ -599,8 +585,7 @@ void GenericSTKMeshStruct::setSideSetBulkData ( auto& sis = (it_sis==side_set_sis.end() ? dummy_sis : it_sis->second); - params_ss = Teuchos::rcp(new Teuchos::ParameterList(ssd_list.sublist(it.first))); - it.second->setBulkData(comm,sis,worksetSize); // Cell equations are also defined on the side, but not vice-versa + it.second->setBulkData(comm,sis); } } } diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp index ae10b526d5..d07d6a287b 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp @@ -40,8 +40,7 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct int getNumParams() const {return num_params; } void SetupFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const int worksetSize_); + const Teuchos::RCP& sis); void printParts(stk::mesh::MetaData *metaData); @@ -71,19 +70,15 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct //! Completes the creation of the side set mesh structs (if of type SideSetSTKMeshStruct) void setSideSetFieldData (const Teuchos::RCP& comm, - const std::map >& side_set_sis, - int worksetSize); + const std::map >& side_set_sis); - void setSideSetBulkData (const Teuchos::RCP& comm, - const std::map >& side_set_sis, - int worksetSize); + void setSideSetBulkData (const Teuchos::RCP& comm); - void setSideSetFieldAndBulkData (const Teuchos::RCP& comm, - const std::map >& side_set_sis, - int worksetSize) + void setSideSetFieldAndBulkData(const Teuchos::RCP& comm, + const std::map >& side_set_sis) { - setSideSetFieldData(comm, side_set_sis, worksetSize); - setSideSetBulkData(comm, side_set_sis, worksetSize); + setSideSetFieldData(comm, side_set_sis); + setSideSetBulkData(comm); } //! Loads from file input required fields not found in the mesh diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp index 6607b3b6d1..aa62e2b23b 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp @@ -256,15 +256,12 @@ void GmshSTKMeshStruct::setFieldData( const Teuchos::RCP& sis, const std::map >& side_set_sis) { - this->SetupFieldData (comm, sis, worksetSize); - this->setSideSetFieldData(comm, side_set_sis, worksetSize); + this->SetupFieldData (comm, sis); + this->setSideSetFieldData(comm, side_set_sis); } -void GmshSTKMeshStruct::setBulkData( - const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void GmshSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm) { metaData->commit(); @@ -371,7 +368,7 @@ void GmshSTKMeshStruct::setBulkData( this->loadRequiredInputFields (comm); // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(comm, side_set_sis, worksetSize); + this->setSideSetBulkData(comm); fieldAndBulkDataSet = true; } diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.hpp b/src/disc/stk/Albany_GmshSTKMeshStruct.hpp index 7af89c8076..4f13b3bf53 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.hpp @@ -30,13 +30,9 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index 4a754b9f13..cf0009a877 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -285,10 +285,9 @@ IossSTKMeshStruct::~IossSTKMeshStruct() void IossSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) { - this->SetupFieldData(comm, sis, worksetSize); + this->SetupFieldData(comm, sis); if(mesh_data->is_bulk_data_null()) mesh_data->set_bulk_data(*bulkData); @@ -479,10 +478,7 @@ setFieldData (const Teuchos::RCP& comm, } void IossSTKMeshStruct:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) +setBulkData (const Teuchos::RCP& comm) { mesh_data->add_all_mesh_fields_as_input_fields(); // KL: this adds "solution field" std::vector missing; @@ -746,7 +742,7 @@ setBulkData (const Teuchos::RCP& comm, this->checkNodeSetsFromSideSetsIntegrity (); // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(comm, side_set_sis); + this->setSideSetBulkData(comm); fieldAndBulkDataSet = true; } diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.hpp b/src/disc/stk/Albany_IossSTKMeshStruct.hpp index 06dbbe3e04..1b16e64839 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.hpp @@ -30,13 +30,9 @@ namespace Albany { void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); int getSolutionFieldHistoryDepth() const {return m_solutionFieldHistoryDepth;} double getSolutionFieldHistoryStamp(int step) const; diff --git a/src/disc/stk/Albany_STK3DPointStruct.cpp b/src/disc/stk/Albany_STK3DPointStruct.cpp index cb5c11958c..7c887c25c0 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.cpp +++ b/src/disc/stk/Albany_STK3DPointStruct.cpp @@ -53,19 +53,15 @@ STK3DPointStruct(const Teuchos::RCP& params, void STK3DPointStruct:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) { std::cout << "---3DPoint::setFieldData---" << std::endl; - SetupFieldData(comm, sis, worksetSize); - this->setSideSetFieldData(comm, side_set_sis, worksetSize); + SetupFieldData(comm, sis); + this->setSideSetFieldData(comm, side_set_sis); } void STK3DPointStruct:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +setBulkData (const Teuchos::RCP& comm) { std::cout << "---3DPoint::setBulkData---" << std::endl; metaData->commit(); @@ -85,7 +81,7 @@ setBulkData (const Teuchos::RCP& comm, bulkData->modification_end(); fieldAndBulkDataSet = true; - this->setSideSetBulkData(comm, side_set_sis, worksetSize); + this->setSideSetBulkData(comm); } void diff --git a/src/disc/stk/Albany_STK3DPointStruct.hpp b/src/disc/stk/Albany_STK3DPointStruct.hpp index 617ba28e1d..09f3c6b5f1 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.hpp +++ b/src/disc/stk/Albany_STK3DPointStruct.hpp @@ -30,13 +30,9 @@ namespace Albany { //! Sets mesh generation parameters void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp index 8dc1381900..01fdb0d603 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp @@ -125,17 +125,13 @@ setParentMeshInfo (const AbstractSTKMeshStruct& parentMeshStruct_, void SideSetSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& /*side_set_sis*/) { - this->SetupFieldData(comm, sis, worksetSize); + this->SetupFieldData(comm, sis); } void SideSetSTKMeshStruct:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /*side_set_sis*/) +setBulkData (const Teuchos::RCP& comm) { TEUCHOS_TEST_FOR_EXCEPTION ( parentMeshStruct->ssPartVec.count(parentMeshSideSetName)==0, std::logic_error, diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp index b45d9463b7..44e826b3eb 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.hpp @@ -28,10 +28,7 @@ class SideSetSTKMeshStruct : public GenericSTKMeshStruct const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); void setParentMeshInfo (const AbstractSTKMeshStruct& parentMeshStruct_, const std::string& sideSetName); diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp index e26cd34edd..4545e2f29e 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp @@ -94,13 +94,9 @@ class TmplSTKMeshStruct : public GenericSTKMeshStruct { //! Sets mesh generation parameters void setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis = {}); + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return false; } @@ -187,15 +183,11 @@ template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis); template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis); +setBulkData (const Teuchos::RCP& comm); template<> Teuchos::RCP TmplSTKMeshStruct<0>::getValidDiscretizationParameters() const; template<> Teuchos::RCP TmplSTKMeshStruct<1>::getValidDiscretizationParameters() const; diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp index 140d22028d..c76422d427 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp @@ -304,7 +304,6 @@ void TmplSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& side_set_sis) { // Create global mesh: Dim-D structured, rectangular @@ -325,16 +324,13 @@ setFieldData (const Teuchos::RCP& comm, x[idx][i] = x[idx][i - 1] + h_dim[idx][i - 1]; // place the coordinates of the element nodes } - SetupFieldData(comm, sis, worksetSize); - this->setSideSetFieldData(comm, side_set_sis, worksetSize); + SetupFieldData(comm, sis); + this->setSideSetFieldData(comm, side_set_sis); } template void TmplSTKMeshStruct:: -setBulkData (const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +setBulkData (const Teuchos::RCP& comm) { metaData->commit(); @@ -354,7 +350,7 @@ setBulkData (const Teuchos::RCP& comm, fieldAndBulkDataSet = true; // Finally, setup the side set meshes (if any) - this->setSideSetBulkData(comm, side_set_sis, worksetSize); + this->setSideSetBulkData(comm); } template @@ -543,19 +539,12 @@ void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, - const unsigned int worksetSize, const std::map >& /*side_set_sis*/) { - SetupFieldData(comm, sis, worksetSize); + SetupFieldData(comm, sis); } -template<> -void -TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >::setBulkData( - const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /*side_set_sis*/) +setBulkData(const Teuchos::RCP& comm) { metaData->commit(); From a352eb1fa80e10b326db3c736433c468b2175aed Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 9 Nov 2023 11:26:23 -0700 Subject: [PATCH 06/12] In STK meshes, use separate flags for field and bulk data being set --- src/disc/stk/Albany_AbstractSTKMeshStruct.hpp | 3 +- src/disc/stk/Albany_AsciiSTKMesh2D.cpp | 4 +- src/disc/stk/Albany_AsciiSTKMeshStruct.cpp | 4 +- src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 4 +- src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 54 +++++-------------- src/disc/stk/Albany_GmshSTKMeshStruct.cpp | 3 +- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 2 +- src/disc/stk/Albany_STK3DPointStruct.cpp | 4 +- src/disc/stk/Albany_SideSetSTKMeshStruct.cpp | 5 ++ src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp | 4 +- 10 files changed, 38 insertions(+), 49 deletions(-) diff --git a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp index 968bb26b50..61d5f7b6c2 100644 --- a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp @@ -165,7 +165,8 @@ struct AbstractSTKMeshStruct : public AbstractMeshStruct std::map> sideSetMeshStructs; - bool fieldAndBulkDataSet; + bool fieldDataSet = false; + bool bulkDataSet = false; virtual void buildCellSideNodeNumerationMap( diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp index 47de5ae9e6..aa53dde9db 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp @@ -305,6 +305,8 @@ setFieldData (const Teuchos::RCP& comm, const std::map >& /* side_set_sis */) { this->SetupFieldData(comm, sis); + + fieldDataSet = true; } void AsciiSTKMesh2D:: @@ -440,7 +442,7 @@ setBulkData (const Teuchos::RCP& comm) // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) this->setSideSetBulkData(comm); - fieldAndBulkDataSet = true; + bulkDataSet = true; } Teuchos::RCP diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp index def6148d09..a677bc2f0a 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp @@ -423,6 +423,7 @@ setFieldData (const Teuchos::RCP& comm, { this->SetupFieldData(comm, sis); this->setSideSetFieldData(comm, side_set_sis); + fieldDataSet = true; } void AsciiSTKMeshStruct:: @@ -715,7 +716,8 @@ setBulkData (const Teuchos::RCP& comm) fix_node_sharing(*bulkData); bulkData->modification_end(); - fieldAndBulkDataSet = true; + bulkDataSet = true; + this->setSideSetBulkData(comm); } diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 1a66e72194..79ae7fe2da 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -202,6 +202,8 @@ setFieldData (const Teuchos::RCP& comm, // Set side meshes fields this->setSideSetFieldData(comm, side_set_sis); + + fieldDataSet = true; } void ExtrudedSTKMeshStruct:: @@ -575,7 +577,7 @@ setBulkData (const Teuchos::RCP& comm) //fix_node_sharing(*bulkData); bulkData->modification_end(); - fieldAndBulkDataSet = true; + bulkDataSet = true; // Check that the nodeset created from sidesets contain the right number of nodes this->checkNodeSetsFromSideSetsIntegrity (); diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index 8f22e24abe..cd3ef75b1a 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -73,8 +73,6 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( // This is typical, can be resized for multiple material problems meshSpecs.resize(1); - - fieldAndBulkDataSet = false; } void GenericSTKMeshStruct:: @@ -541,52 +539,26 @@ void GenericSTKMeshStruct:: setSideSetFieldData (const Teuchos::RCP& comm, const std::map >& side_set_sis) { - if (this->sideSetMeshStructs.size()>0) { - // Dummy sis if not present in the maps for a given side set. - // This could happen if the side discretization has no states - auto dummy_sis = Teuchos::rcp(new StateInfoStruct()); - - for (auto it : sideSetMeshStructs) { - auto sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); - if (sideMesh!=Teuchos::null) { - // SideSetSTK mesh need to build the mesh - sideMesh->setParentMeshInfo(*this, it.first); - } - - // We check since the basal mesh for extruded stk mesh should already have it set - if (!it.second->fieldAndBulkDataSet) { - auto it_sis = side_set_sis.find(it.first); - - auto& sis = (it_sis==side_set_sis.end() ? dummy_sis : it_sis->second); + for (auto it : sideSetMeshStructs) { + auto sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); + if (sideMesh!=Teuchos::null) { + // SideSetSTK mesh need to build the mesh + sideMesh->setParentMeshInfo(*this, it.first); + } - it.second->setFieldData(comm,sis); // Cell equations are also defined on the side, but not vice-versa - } + if (not it.second->fieldDataSet) { + auto sis = side_set_sis.count(it.first)>0 ? side_set_sis.at(it.first) : Teuchos::null; + it.second->setFieldData(comm,sis); } } } void GenericSTKMeshStruct:: +setSideSetBulkData (const Teuchos::RCP& comm) { - if (this->sideSetMeshStructs.size()>0) { - // Dummy sis if not present in the maps for a given side set. - // This could happen if the side discretization has no states - Teuchos::RCP dummy_sis = Teuchos::rcp(new StateInfoStruct()); - - for (auto it : sideSetMeshStructs) { - auto sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); - if (sideMesh!=Teuchos::null) { - // SideSetSTK mesh need to build the mesh - sideMesh->setParentMeshInfo(*this, it.first); - } - - // We check since the basal mesh for extruded stk mesh should already have it set - if (!it.second->fieldAndBulkDataSet) { - auto it_sis = side_set_sis.find(it.first); - - auto& sis = (it_sis==side_set_sis.end() ? dummy_sis : it_sis->second); - - it.second->setBulkData(comm,sis); - } + for (auto it : sideSetMeshStructs) { + if (not it.second->bulkDataSet) { + it.second->setBulkData(comm); } } } diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp index aa62e2b23b..83283aeed7 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp @@ -258,6 +258,7 @@ void GmshSTKMeshStruct::setFieldData( { this->SetupFieldData (comm, sis); this->setSideSetFieldData(comm, side_set_sis); + fieldDataSet = true; } void GmshSTKMeshStruct:: @@ -370,7 +371,7 @@ setBulkData (const Teuchos::RCP& comm) // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) this->setSideSetBulkData(comm); - fieldAndBulkDataSet = true; + bulkDataSet = true; } Teuchos::RCP GmshSTKMeshStruct::getValidDiscretizationParameters() const diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index cf0009a877..a3503b7b45 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -744,7 +744,7 @@ setBulkData (const Teuchos::RCP& comm) // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) this->setSideSetBulkData(comm); - fieldAndBulkDataSet = true; + bulkDataSet = true; } double diff --git a/src/disc/stk/Albany_STK3DPointStruct.cpp b/src/disc/stk/Albany_STK3DPointStruct.cpp index 7c887c25c0..2e4fd2d941 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.cpp +++ b/src/disc/stk/Albany_STK3DPointStruct.cpp @@ -58,6 +58,8 @@ setFieldData (const Teuchos::RCP& comm, std::cout << "---3DPoint::setFieldData---" << std::endl; SetupFieldData(comm, sis); this->setSideSetFieldData(comm, side_set_sis); + + fieldDataSet = true; } void STK3DPointStruct:: @@ -80,7 +82,7 @@ setBulkData (const Teuchos::RCP& comm) bulkData->modification_end(); - fieldAndBulkDataSet = true; + bulkDataSet = true; this->setSideSetBulkData(comm); } diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp index 01fdb0d603..bc97f7ce16 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp @@ -118,6 +118,8 @@ void SideSetSTKMeshStruct:: setParentMeshInfo (const AbstractSTKMeshStruct& parentMeshStruct_, const std::string& sideSetName) { + TEUCHOS_TEST_FOR_EXCEPTION (not parentMeshStruct.is_null(), std::logic_error, + "[SideSetSTKMeshStruct::setParentMeshInfo] Parent mesh was already set.\n"); parentMeshStruct = Teuchos::rcpFromRef(parentMeshStruct_); parentMeshSideSetName = sideSetName; } @@ -128,6 +130,7 @@ setFieldData (const Teuchos::RCP& comm, const std::map >& /*side_set_sis*/) { this->SetupFieldData(comm, sis); + fieldDataSet = true; } void SideSetSTKMeshStruct:: @@ -210,6 +213,8 @@ setBulkData (const Teuchos::RCP& comm) // Insertion of entities end bulkData->modification_end(); + + bulkDataSet = true; } Teuchos::RCP SideSetSTKMeshStruct::getValidDiscretizationParameters() const diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp index c76422d427..dcb8c0d964 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp @@ -326,6 +326,8 @@ setFieldData (const Teuchos::RCP& comm, SetupFieldData(comm, sis); this->setSideSetFieldData(comm, side_set_sis); + + fieldDataSet = true; } template @@ -347,7 +349,7 @@ setBulkData (const Teuchos::RCP& comm) // Rebalance the mesh before starting the simulation if indicated rebalanceInitialMesh(comm); - fieldAndBulkDataSet = true; + bulkDataSet = true; // Finally, setup the side set meshes (if any) this->setSideSetBulkData(comm); From 6a5e136488fa76400ea635a72e912a9d095344a6 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 9 Nov 2023 11:17:08 -0700 Subject: [PATCH 07/12] Clean up how IossSTKMeshStruct reads fields Both setFieldData and setBulkData were populating the bulk data, and reading fields from the mesh. --- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 489 +++++----------------- src/disc/stk/Albany_IossSTKMeshStruct.hpp | 12 +- 2 files changed, 117 insertions(+), 384 deletions(-) diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index a3503b7b45..2596e57a2c 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -57,9 +57,6 @@ IossSTKMeshStruct(const Teuchos::RCP& params_, , out(Teuchos::VerboseObjectBase::getDefaultOStream()) , useSerialMesh(false) , periodic(params->get("Periodic BC", false)) - , m_hasRestartSolution(false) - , m_restartDataTime(-1.0) - , m_solutionFieldHistoryDepth(0) { params->validateParameters(*getValidDiscretizationParameters(),0); @@ -157,6 +154,9 @@ IossSTKMeshStruct(const Teuchos::RCP& params_, } } + *out << "IOSS-STK: number of node sets = " << nsPartVec.size() << std::endl; + *out << "IOSS-STK: number of side sets = " << ssPartVec.size() << std::endl; + // the method 'initializesidesetmeshspecs' requires that ss parts store a valid stk topology. // therefore, we try to retrieve the topology of this part using stk stuff. auto r = mesh_data->get_input_ioss_region(); @@ -197,17 +197,13 @@ IossSTKMeshStruct(const Teuchos::RCP& params_, } // Construct MeshSpecsStruct - { - const CellTopologyData& ctd = *elementBlockTopologies_[0].getCellTopologyData(); - this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct( - ctd, numDim, nsNames, ssNames, worksetSize, partVec[0]->name(), - ebNameToIndex)); - } + const CellTopologyData& ctd = *elementBlockTopologies_[0].getCellTopologyData(); + this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct( + ctd, numDim, nsNames, ssNames, worksetSize, partVec[0]->name(), + ebNameToIndex)); - { - const Ioss::Region& inputRegion = *(mesh_data->get_input_ioss_region()); - m_solutionFieldHistoryDepth = inputRegion.get_property("state_count").get_int(); - } + const Ioss::Region& inputRegion = *(mesh_data->get_input_ioss_region()); + m_solutionFieldHistoryDepth = inputRegion.get_property("state_count").get_int(); // Upon request, add a nodeset for each sideset if (params->get("Build Node Sets From Side Sets",false)) @@ -292,131 +288,88 @@ setFieldData (const Teuchos::RCP& comm, if(mesh_data->is_bulk_data_null()) mesh_data->set_bulk_data(*bulkData); - *out << "IOSS-STK: number of node sets = " << nsPartVec.size() << std::endl; - *out << "IOSS-STK: number of side sets = " << ssPartVec.size() << std::endl; - - std::vector missing; // Restart index to read solution from exodus file. - int index = params->get("Restart Index",-1); // Default to no restart - double res_time = params->get("Restart Time",-1.0); // Default to no restart - Ioss::Region& region = *(mesh_data->get_input_ioss_region()); - /* - * The following code block reads a single mesh on PE 0, then distributes the mesh across - * the other processors. stk_rebalance is used, which requires Zoltan - * - * This code is only compiled if ALBANY_ZOLTAN is true - */ - -#ifdef ALBANY_ZOLTAN // rebalance needs Zoltan - - if(useSerialMesh){ - - // trick to avoid hanging + if (params->isParameter("Restart Index")) { + TEUCHOS_TEST_FOR_EXCEPTION ( + params->isParameter("Restart Time"), std::logic_error, + "Error! Do not provide both 'Restart Index' and 'Restart Time'.\n"); + + // User has specified a time step to restart at + int index = params->get("Restart Index"); // Default to no restart + + const auto& region = *mesh_data->get_input_ioss_region(); + m_restartDataTime = region.get_state_time(index); + m_hasRestartSolution = true; + + *out << "Restart Index set, reading solution index : " << index << std::endl; + } else if (params->isParameter("Restart Time")) { + m_restartDataTime = params->get("Restart Time"); + // User has specified a time to restart at + m_hasRestartSolution = true; + *out << "Restart solution time set, reading solution time : " << m_restartDataTime << std::endl; + } else { + *out << "Neither restart index or time are set. Not reading solution data from exodus file"<< std::endl; + } - if(comm->getRank() == 0){ // read in the mesh on PE 0 - mesh_data->populate_bulk_data(); + if (m_hasRestartSolution) { + mesh_data->add_all_mesh_fields_as_input_fields(); // KL: this adds "solution field" + Teuchos::Array default_field = {{"solution", "solution_dot", "solution_dotdot"}}; + const auto& restart_fields = params->get >("Restart Fields", default_field); - if (this->numDim!=3) - { - // Try to load 3d coordinates (if present in the input file) - loadOrSetCoordinates3d(index); - } + // Check if states are available in the mesh + const auto& region = *mesh_data->get_input_ioss_region(); + const auto& node_blocks = region.get_node_blocks(); - // Read solution from exodus file. - if (index >= 0) { // User has specified a time step to restart at - m_restartDataTime = region.get_state_time(index); - m_hasRestartSolution = true; - } - else if (res_time >= 0) { // User has specified a time to restart at - m_restartDataTime = res_time; - m_hasRestartSolution = true; + for (const auto& st_ptr : *sis) { + auto& st = *st_ptr; + if (std::find(restart_fields.begin(),restart_fields.end(),st.name)==restart_fields.end()) { + continue; } - else { - *out << "Neither restart index or time are set. Not reading solution data from exodus file"<< std::endl; + st.restartDataAvailable = node_blocks.size()>0; + for (const auto& block : node_blocks) { + st.restartDataAvailable &= block->field_exists(st.name); } } - } // End UseSerialMesh - reading mesh on PE 0 - - else -#endif - - /* - * The following code block reads a single mesh when Albany is compiled serially, or a - * Nemspread fileset if ALBANY_MPI is true. - * - */ - - { // running in Serial or Parallel read from Nemspread files - if (this->numDim!=3) - { - // Try to load 3d coordinates (if present in the input file) - loadOrSetCoordinates3d(index); - } + } - if (!usePamgen) - { - // Read solution from exodus file. - if (index >= 0) - { // User has specified a time step to restart at - m_restartDataTime = region.get_state_time(index); - m_hasRestartSolution = true; - } - else if (res_time >= 0) - { // User has specified a time to restart at - m_restartDataTime = res_time; - m_hasRestartSolution = true; - } - else - { - *out << "Restart Index not set. Not reading solution from exodus (" << index << ")"<< std::endl; - } - } + this->setSideSetFieldData(comm, side_set_sis); +} - } // End Parallel Read - or running in serial +void IossSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm) +{ + metaData->commit(); - if(m_hasRestartSolution){ +#ifdef ALBANY_ZOLTAN // rebalance needs Zoltan + // The following code block reads a single mesh on PE 0, then distributes the mesh across + // the other processors. stk_rebalance is used, which requires Zoltan + if (useSerialMesh){ - Teuchos::Array default_field = {{"solution", "solution_dot", "solution_dotdot"}}; - auto& restart_fields = params->get >("Restart Fields", default_field); - - // Get the fields to be used for restart - - // See what state data was initialized from the stk::io request - // This should be propagated into stk::io - const Ioss::NodeBlockContainer& node_blocks = region.get_node_blocks(); - - // Uncomment to print what fields are in the exodus file - // const Ioss::ElementBlockContainer& elem_blocks = region.get_element_blocks(); - // for (const auto& block : elem_blocks) { - // Ioss::NameList exo_eb_fld_names; - // block->field_describe(&exo_eb_fld_names); - // for (const auto& name : exo_eb_fld_names) { - // *out << "Found field \"" << name << "\" in elem blocks of exodus file\n"; - // } - // } - // for (const auto& block : node_blocks) { - // Ioss::NameList exo_nb_fld_names; - // block->field_describe(&exo_nb_fld_names); - // for (const auto& name : exo_nb_fld_names) { - // *out << "Found field \"" << name << "\" in node blocks of exodus file\n"; - // } - // } + // trick to avoid hanging + bulkData->modification_begin(); - for (const auto& st_ptr : *sis) { - auto& st = *st_ptr; - for (const auto& block : node_blocks) { - if (block->field_exists(st.name)) { - for (const auto& restart_field : restart_fields) { - if (st.name==restart_field) { - *out << "Restarting from field \"" << st.name << "\" found in exodus file.\n"; - st.restartDataAvailable = true; - break; - } - } - } - } + if(comm->getRank() == 0){ + mesh_data->populate_bulk_data(); + } else { + // trick to avoid hanging + bulkData->modification_begin(); bulkData->modification_begin(); } + bulkData->modification_end(); + + } else +#endif + { + // The following code block reads a single mesh when Albany is compiled serially, or a + // Nemspread fileset if ALBANY_MPI is true. + bulkData->modification_begin(); + mesh_data->populate_bulk_data(); + bulkData->modification_end(); + } + // Note: we cannot load fields/coords during setFieldData, since we need a valid bulkData + std::vector missing; + if (m_hasRestartSolution) { + mesh_data->read_defined_input_fields(m_restartDataTime, &missing); // Read global mesh variables. Should we emit warnings at all? for (auto& it : fieldContainer->getMeshVectorStates()) { bool found = mesh_data->get_global (it.first, it.second, false); // Last variable is abort_if_not_found. We don't want that. @@ -437,23 +390,14 @@ setFieldData (const Teuchos::RCP& comm, if (!found) *out << " *** WARNING *** Mesh scalar integer state '" << it.first << "' was not found in the mesh database.\n"; } - } else { - // We put all the fields as 'missing' - for (const auto& f : metaData->get_fields()) { - missing.emplace_back(f,f->name()); - } } // If this is a boundary mesh, the side_map/side_node_map may already be present, so we check - side_maps_present = true; - bool coherence = true; - for (const auto& it : missing) { - if (it.field()->name()=="side_to_cell_map" || it.field()->name()=="side_nodes_ids") - { - side_maps_present = false; - coherence = !coherence; // Both fields should be present or absent so coherence should change exactly twice - } - } + auto region = mesh_data->get_input_ioss_region(); + const auto& elem_blocks = region->get_element_blocks(); + auto *eb = elem_blocks[0]; + side_maps_present = eb->field_exists("side_to_cell_map") and eb->field_exists("side_nodes_ids"); + const bool coherence = eb->field_exists("side_to_cell_map") == eb->field_exists("side_nodes_ids"); TEUCHOS_TEST_FOR_EXCEPTION (!coherence, std::runtime_error, "Error! The maps 'side_to_cell_map' and 'side_nodes_ids' should either both be present or both missing, but only one of them was found in the mesh file.\n"); if (useSerialMesh) @@ -465,132 +409,9 @@ setFieldData (const Teuchos::RCP& comm, side_maps_present = bool_to_int == 1 ? true : false; } - // Loading required input fields from file - //this->loadRequiredInputFields (comm); - - // Rebalance the mesh before starting the simulation if indicated - rebalanceInitialMesh (comm); - - // Check that the nodeset created from sidesets contain the right number of nodes - this->checkNodeSetsFromSideSetsIntegrity (); - - this->setSideSetFieldData(comm, side_set_sis); -} - -void IossSTKMeshStruct:: -setBulkData (const Teuchos::RCP& comm) -{ - mesh_data->add_all_mesh_fields_as_input_fields(); // KL: this adds "solution field" - std::vector missing; - - metaData->commit(); - - // Restart index to read solution from exodus file. - int index = params->get("Restart Index",-1); // Default to no restart - double res_time = params->get("Restart Time",-1.0); // Default to no restart - Ioss::Region& region = *(mesh_data->get_input_ioss_region()); - /* - * The following code block reads a single mesh on PE 0, then distributes the mesh across - * the other processors. stk_rebalance is used, which requires Zoltan - * - * This code is only compiled if ALBANY_ZOLTAN is true - */ - -#ifdef ALBANY_ZOLTAN // rebalance needs Zoltan - - if(useSerialMesh){ - - // trick to avoid hanging - bulkData->modification_begin(); - - if(comm->getRank() == 0){ // read in the mesh on PE 0 - - - //stk::io::process_mesh_bulk_data(region, *bulkData); - mesh_data->populate_bulk_data(); - - if (this->numDim!=3) - { - // Try to load 3d coordinates (if present in the input file) - loadOrSetCoordinates3d(index); - } - - //bulkData = &mesh_data->bulk_data(); - - // Read solution from exodus file. - if (index >= 0) { // User has specified a time step to restart at - *out << "Restart Index set, reading solution index : " << index << std::endl; - mesh_data->read_defined_input_fields(index, &missing); - m_restartDataTime = region.get_state_time(index); - m_hasRestartSolution = true; - } - else if (res_time >= 0) { // User has specified a time to restart at - *out << "Restart solution time set, reading solution time : " << res_time << std::endl; - mesh_data->read_defined_input_fields(res_time, &missing); - m_restartDataTime = res_time; - m_hasRestartSolution = true; - } - else { - *out << "Neither restart index or time are set. Not reading solution data from exodus file"<< std::endl; - } - } - else { - // trick to avoid hanging - bulkData->modification_begin(); bulkData->modification_begin(); - } - - bulkData->modification_end(); - - } // End UseSerialMesh - reading mesh on PE 0 - - else -#endif - - /* - * The following code block reads a single mesh when Albany is compiled serially, or a - * Nemspread fileset if ALBANY_MPI is true. - * - */ - - { // running in Serial or Parallel read from Nemspread files - bulkData->modification_begin(); - mesh_data->populate_bulk_data(); - if (this->numDim!=3) - { - // Try to load 3d coordinates (if present in the input file) - loadOrSetCoordinates3d(index); - } - - if (!usePamgen) - { - // Read solution from exodus file. - if (index >= 0) - { // User has specified a time step to restart at - *out << "Restart Index set, reading solution index : " << index << std::endl; - mesh_data->read_defined_input_fields(index, &missing); - m_restartDataTime = region.get_state_time(index); - m_hasRestartSolution = true; - } - else if (res_time >= 0) - { // User has specified a time to restart at - *out << "Restart solution time set, reading solution time : " << res_time << std::endl; - mesh_data->read_defined_input_fields(res_time, &missing); - m_restartDataTime = res_time; - m_hasRestartSolution = true; - } - else - { - *out << "Restart Index not set. Not reading solution from exodus (" << index << ")"<< std::endl; - } - } - - bulkData->modification_end(); - - } // End Parallel Read - or running in serial - // Check if the input mesh is layered (i.e., if it stores layers info) std::string state_name = "layer_thickness_ratio"; - if(mesh_data->has_input_global(state_name)) { + if (mesh_data->has_input_global(state_name)) { // layer ratios std::vector ltr; mesh_data->get_global (state_name, ltr, true); @@ -646,93 +467,10 @@ setBulkData (const Teuchos::RCP& comm) this->local_cell_layers_data->bot_side_pos = this->meshSpecs[0]->ctd.side_count - 2; } - if(m_hasRestartSolution){ - - Teuchos::Array default_field = {{"solution", "solution_dot", "solution_dotdot"}}; - auto& restart_fields = params->get >("Restart Fields", default_field); - - // Get the fields to be used for restart - - // See what state data was initialized from the stk::io request - // This should be propagated into stk::io - const Ioss::NodeBlockContainer& node_blocks = region.get_node_blocks(); - - // Uncomment to print what fields are in the exodus file - // const Ioss::ElementBlockContainer& elem_blocks = region.get_element_blocks(); - // for (const auto& block : elem_blocks) { - // Ioss::NameList exo_eb_fld_names; - // block->field_describe(&exo_eb_fld_names); - // for (const auto& name : exo_eb_fld_names) { - // *out << "Found field \"" << name << "\" in elem blocks of exodus file\n"; - // } - // } - // for (const auto& block : node_blocks) { - // Ioss::NameList exo_nb_fld_names; - // block->field_describe(&exo_nb_fld_names); - // for (const auto& name : exo_nb_fld_names) { - // *out << "Found field \"" << name << "\" in node blocks of exodus file\n"; - // } - // } - - for (const auto& st_ptr : *sis) { - auto& st = *st_ptr; - for (const auto& block : node_blocks) { - if (block->field_exists(st.name)) { - for (const auto& restart_field : restart_fields) { - if (st.name==restart_field) { - *out << "Restarting from field \"" << st.name << "\" found in exodus file.\n"; - st.restartDataAvailable = true; - break; - } - } - } - } - } - - // Read global mesh variables. Should we emit warnings at all? - for (auto& it : fieldContainer->getMeshVectorStates()) { - bool found = mesh_data->get_global (it.first, it.second, false); // Last variable is abort_if_not_found. We don't want that. - if (!found) - *out << " *** WARNING *** Mesh vector state '" << it.first << "' was not found in the mesh database.\n"; - } - - for (auto& it : fieldContainer->getMeshScalarIntegerStates()) { - bool found = mesh_data->get_global (it.first, it.second, false); // Last variable is abort_if_not_found. We don't want that. - if (!found) - *out << " *** WARNING *** Mesh scalar integer state '" << it.first << "' was not found in the mesh database.\n"; - } - } else { - // We put all the fields as 'missing' - const stk::mesh::FieldVector& fields = metaData->get_fields(); - for (decltype(fields.size()) i=0; iname()); - missing.push_back(stk::io::MeshField(fields[i],fields[i]->name())); - } - } - - // If this is a boundary mesh, the side_map/side_node_map may already be present, so we check - side_maps_present = true; - bool coherence = true; - for (const auto& it : missing) - { - if (it.field()->name()=="side_to_cell_map" || it.field()->name()=="side_nodes_ids") - { - side_maps_present = false; - coherence = !coherence; // Both fields should be present or absent so coherence should change exactly twice - } - } - TEUCHOS_TEST_FOR_EXCEPTION (!coherence, std::runtime_error, "Error! The maps 'side_to_cell_map' and 'side_nodes_ids' should either both be present or both missing, but only one of them was found in the mesh file.\n"); - - if (useSerialMesh) - { - // Only proc 0 actually read the mesh, and can confirm whether or not the side maps were present - // Unfortunately, Teuchos does not have a specialization for type bool when it comes to communicators, so we need ints - int bool_to_int = side_maps_present ? 1 : 0; - Teuchos::broadcast(*comm,0,1,&bool_to_int); - side_maps_present = bool_to_int == 1 ? true : false; - } + // Set 3d coords *before* loading fields, or else you won't have x/y/z available + loadOrSetCoordinates3d(); - // Loading required input fields from file + // Load any required field from file this->loadRequiredInputFields (comm); // Rebalance the mesh before starting the simulation if indicated @@ -747,18 +485,8 @@ setBulkData (const Teuchos::RCP& comm) bulkDataSet = true; } -double -IossSTKMeshStruct::getSolutionFieldHistoryStamp(int step) const -{ - TEUCHOS_ASSERT(step >= 0 && step < m_solutionFieldHistoryDepth); - - const int index = step + 1; // 1-based step indexing - const Ioss::Region & inputRegion = *(mesh_data->get_input_ioss_region()); - return inputRegion.get_state_time(index); -} - void -IossSTKMeshStruct::loadOrSetCoordinates3d(int index) +IossSTKMeshStruct::loadOrSetCoordinates3d() { const std::string coords3d_name = "coordinates3d"; @@ -766,8 +494,12 @@ IossSTKMeshStruct::loadOrSetCoordinates3d(int index) const Ioss::NodeBlockContainer& node_blocks = region->get_node_blocks(); Ioss::NodeBlock *nb = node_blocks[0]; - if (nb->field_exists(coords3d_name) && index>0) - { + const int current_step = region->get_current_state(); + const int index = params->isParameter("Restart Index") + ? params->get("Restart Index") + : current_step; + + if (nb->field_exists(coords3d_name) and index!=-1) { // The field "coordinates3d" exists in the input mesh // (which must then come from a previous Albany run), so load it. std::vector nodes; @@ -780,37 +512,38 @@ IossSTKMeshStruct::loadOrSetCoordinates3d(int index) // or different to the one desired, we set it to the restart // index state. If the state was already set, we also take // care of resetting the index back to the original configuration. - const int current_step = region->get_current_state(); - if (current_step != index) { - if (current_step != -1) { - region->end_state(current_step); - } - region->begin_state(index); + + if (current_step != -1) { + region->end_state(current_step); } + region->begin_state(index); stk::io::field_data_from_ioss(*bulkData, this->getCoordinatesField3d(), nodes, nb, coords3d_name); + region->end_state(index); + if (current_step != -1) { - region->begin_state(index); + region->begin_state(current_step); } - } - else - { + } else { if (nb->field_exists(coords3d_name)) { // The 3d coords field exists in the input mesh, but the restart index was // not set in the input file. We issue a warning, and load default coordinates *out << "WARNING! The field 'coordinates3d' was found in the input mesh, but no restart index was specified.\n" << " Albany will set the 3d coordinates to the 'default' ones (filling native coordinates with trailing zeros).\n"; } - // The input mesh does not store the 'coordinates3d' field - // (perhaps the mesh does not come from a previous Albany run). - // Hence, we initialize coordinates3d with coordinates, - // and we fill 'extra' dimensions with 0's. Hopefully, this is ok. - - // Use GenericSTKMeshStruct functionality - this->setDefaultCoordinates3d(); + setDefaultCoordinates3d(); } } +double +IossSTKMeshStruct::getSolutionFieldHistoryStamp(int step) const +{ + TEUCHOS_ASSERT(step >= 0 && step < m_solutionFieldHistoryDepth); + + const int index = step + 1; // 1-based step indexing + const Ioss::Region & inputRegion = *(mesh_data->get_input_ioss_region()); + return inputRegion.get_state_time(index); +} void IossSTKMeshStruct::loadSolutionFieldHistory(int step) diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.hpp b/src/disc/stk/Albany_IossSTKMeshStruct.hpp index 1b16e64839..34e0e323ce 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.hpp @@ -21,7 +21,7 @@ namespace Albany { class IossSTKMeshStruct : public GenericSTKMeshStruct { - public: + public: IossSTKMeshStruct (const Teuchos::RCP& params, const Teuchos::RCP& commT, const int numParams); @@ -44,11 +44,11 @@ namespace Albany { //! If restarting, convenience function to return restart data time double restartDataTime() const {return m_restartDataTime;} - private: + private: - Ioss::Init::Initializer ioInit; + void loadOrSetCoordinates3d (); - void loadOrSetCoordinates3d (int index); + Ioss::Init::Initializer ioInit; Teuchos::RCP getValidDiscretizationParameters() const; @@ -58,9 +58,9 @@ namespace Albany { bool periodic; Teuchos::RCP mesh_data; - bool m_hasRestartSolution; + bool m_hasRestartSolution = false; double m_restartDataTime; - int m_solutionFieldHistoryDepth; + int m_solutionFieldHistoryDepth = 0; }; From 1cb95fedbd04277ded7c157690585722daffb504 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 9 Nov 2023 11:39:30 -0700 Subject: [PATCH 08/12] Make GenericSTKMeshStruct handle most of the setFieldData work Most STK meshes do not need to do anything in addition to common work --- src/disc/stk/Albany_AsciiSTKMesh2D.cpp | 10 ---------- src/disc/stk/Albany_AsciiSTKMesh2D.hpp | 4 ---- src/disc/stk/Albany_AsciiSTKMeshStruct.cpp | 11 ----------- src/disc/stk/Albany_AsciiSTKMeshStruct.hpp | 4 ---- src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 14 -------------- src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp | 4 ---- src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 9 +++++++-- src/disc/stk/Albany_GenericSTKMeshStruct.hpp | 5 +++-- src/disc/stk/Albany_GmshSTKMeshStruct.cpp | 10 ---------- src/disc/stk/Albany_GmshSTKMeshStruct.hpp | 4 ---- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 4 ++-- src/disc/stk/Albany_STK3DPointStruct.cpp | 12 ------------ src/disc/stk/Albany_STK3DPointStruct.hpp | 5 ----- src/disc/stk/Albany_SideSetSTKMeshStruct.cpp | 9 --------- src/disc/stk/Albany_TmplSTKMeshStruct.hpp | 6 ------ src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp | 12 +----------- 16 files changed, 13 insertions(+), 110 deletions(-) diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp index aa53dde9db..1ca2523ea1 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp @@ -299,16 +299,6 @@ AsciiSTKMesh2D (const Teuchos::RCP& params, this->initializeSideSetMeshStructs(comm); } -void AsciiSTKMesh2D:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& /* side_set_sis */) -{ - this->SetupFieldData(comm, sis); - - fieldDataSet = true; -} - void AsciiSTKMesh2D:: setBulkData (const Teuchos::RCP& comm) { diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.hpp b/src/disc/stk/Albany_AsciiSTKMesh2D.hpp index 1d3064fef7..f317d8702c 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.hpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.hpp @@ -59,10 +59,6 @@ namespace Albany { ~AsciiSTKMesh2D() = default; - void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp index a677bc2f0a..3e051260c6 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp @@ -415,17 +415,6 @@ AsciiSTKMeshStruct::~AsciiSTKMeshStruct() delete [] eles; } -void -AsciiSTKMeshStruct:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) -{ - this->SetupFieldData(comm, sis); - this->setSideSetFieldData(comm, side_set_sis); - fieldDataSet = true; -} - void AsciiSTKMeshStruct:: setBulkData (const Teuchos::RCP& comm) { diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp index f0b7f69f2b..acf9751f46 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.hpp @@ -25,10 +25,6 @@ class AsciiSTKMeshStruct : public GenericSTKMeshStruct ~AsciiSTKMeshStruct(); - void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 79ae7fe2da..116ff95864 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -192,20 +192,6 @@ ExtrudedSTKMeshStruct(const Teuchos::RCP& params, this->initializeSideSetMeshStructs(comm); } -void ExtrudedSTKMeshStruct:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) -{ - // Setting up the field container - this->SetupFieldData(comm, sis); - - // Set side meshes fields - this->setSideSetFieldData(comm, side_set_sis); - - fieldDataSet = true; -} - void ExtrudedSTKMeshStruct:: setBulkData (const Teuchos::RCP& comm) { diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp index 6c81329cc8..68498a0dc9 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.hpp @@ -26,10 +26,6 @@ class ExtrudedSTKMeshStruct : public GenericSTKMeshStruct ~ExtrudedSTKMeshStruct() = default; - void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); // empty map as default - void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index cd3ef75b1a..a152c29714 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -76,8 +76,9 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( } void GenericSTKMeshStruct:: -SetupFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis) +setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const std::map >& side_set_sis) { TEUCHOS_TEST_FOR_EXCEPTION(!metaData->is_initialized(), std::logic_error, "[GenericSTKMeshStruct::SetupFieldData] metaData->initialize(numDim) not yet called" << std::endl); @@ -158,6 +159,10 @@ SetupFieldData (const Teuchos::RCP& comm, writeCoordsToMMFile = params->get("Write Coordinates to MatrixMarket", false); transferSolutionToCoords = params->get("Transfer Solution to Coordinates", false); + + fieldDataSet = true; + + this->setSideSetFieldData(comm, side_set_sis); } void GenericSTKMeshStruct::setAllPartsIO() diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp index d07d6a287b..39987cb3ac 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp @@ -39,8 +39,9 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct int getNumParams() const {return num_params; } - void SetupFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis); + void setFieldData (const Teuchos::RCP& comm, + const Teuchos::RCP& sis, + const std::map >& side_set_sis); void printParts(stk::mesh::MetaData *metaData); diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp index 83283aeed7..3038cf7825 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp @@ -251,16 +251,6 @@ void GmshSTKMeshStruct::broadcast_topology( const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) -{ - this->SetupFieldData (comm, sis); - this->setSideSetFieldData(comm, side_set_sis); - fieldDataSet = true; -} - void GmshSTKMeshStruct:: setBulkData (const Teuchos::RCP& comm) { diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.hpp b/src/disc/stk/Albany_GmshSTKMeshStruct.hpp index 4f13b3bf53..d42c6353f9 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.hpp @@ -28,10 +28,6 @@ class GmshSTKMeshStruct : public GenericSTKMeshStruct ~GmshSTKMeshStruct(); - void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index 2596e57a2c..5019a30a0f 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -283,7 +283,7 @@ setFieldData (const Teuchos::RCP& comm, const Teuchos::RCP& sis, const std::map >& side_set_sis) { - this->SetupFieldData(comm, sis); + GenericSTKMeshStruct::setFieldData(comm, sis, side_set_sis); if(mesh_data->is_bulk_data_null()) mesh_data->set_bulk_data(*bulkData); @@ -332,7 +332,7 @@ setFieldData (const Teuchos::RCP& comm, } } - this->setSideSetFieldData(comm, side_set_sis); + fieldDataSet = true; } void IossSTKMeshStruct:: diff --git a/src/disc/stk/Albany_STK3DPointStruct.cpp b/src/disc/stk/Albany_STK3DPointStruct.cpp index 2e4fd2d941..25ba187560 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.cpp +++ b/src/disc/stk/Albany_STK3DPointStruct.cpp @@ -50,18 +50,6 @@ STK3DPointStruct(const Teuchos::RCP& params, this->initializeSideSetMeshStructs(comm); } -void STK3DPointStruct:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) -{ - std::cout << "---3DPoint::setFieldData---" << std::endl; - SetupFieldData(comm, sis); - this->setSideSetFieldData(comm, side_set_sis); - - fieldDataSet = true; -} - void STK3DPointStruct:: setBulkData (const Teuchos::RCP& comm) { diff --git a/src/disc/stk/Albany_STK3DPointStruct.hpp b/src/disc/stk/Albany_STK3DPointStruct.hpp index 09f3c6b5f1..c7dae838af 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.hpp +++ b/src/disc/stk/Albany_STK3DPointStruct.hpp @@ -27,11 +27,6 @@ namespace Albany { ~STK3DPointStruct() = default; - //! Sets mesh generation parameters - void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); - void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp index bc97f7ce16..4f26f345af 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp @@ -124,15 +124,6 @@ setParentMeshInfo (const AbstractSTKMeshStruct& parentMeshStruct_, parentMeshSideSetName = sideSetName; } -void SideSetSTKMeshStruct:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& /*side_set_sis*/) -{ - this->SetupFieldData(comm, sis); - fieldDataSet = true; -} - void SideSetSTKMeshStruct:: setBulkData (const Teuchos::RCP& comm) { diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp index 4545e2f29e..a39567e560 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp @@ -179,12 +179,6 @@ template<> void TmplSTKMeshStruct<1>::buildMesh(const Teuchos::RCP void TmplSTKMeshStruct<2>::buildMesh(const Teuchos::RCP& commT); template<> void TmplSTKMeshStruct<3>::buildMesh(const Teuchos::RCP& commT); -template<> -void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis); - template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: setBulkData (const Teuchos::RCP& comm); diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp index dcb8c0d964..87764aaced 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp @@ -324,10 +324,7 @@ setFieldData (const Teuchos::RCP& comm, x[idx][i] = x[idx][i - 1] + h_dim[idx][i - 1]; // place the coordinates of the element nodes } - SetupFieldData(comm, sis); - this->setSideSetFieldData(comm, side_set_sis); - - fieldDataSet = true; + GenericSTKMeshStruct::setFieldData(comm, sis, side_set_sis); } template @@ -539,13 +536,6 @@ TmplSTKMeshStruct<0>::buildMesh(const Teuchos::RCP& /* comm template<> void TmplSTKMeshStruct<0, albany_stk_mesh_traits<0> >:: -setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& /*side_set_sis*/) -{ - SetupFieldData(comm, sis); -} - setBulkData(const Teuchos::RCP& comm) { metaData->commit(); From 6cd70720c0907c9ab8fb9965e6d1550033406634 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 6 Dec 2023 15:30:22 -0700 Subject: [PATCH 09/12] Handle side meshes creation/setup from the disc factory * Avoids making GenericSTKMeshStruct call a static method of DiscretizationFactory. In fact, that method no longer need to be static. * Implies we must store the side meshes map in the base class AbstractMeshStruct * Do not call set field/bulk data on side meshes from inside the parent mesh Instead, call it in the disc factory. This ensures that the parent mesh method has fully completed before the side mesh is handled, which may be important for the side mesh (if some parent mesh data is needed) * For SideSetSTK meshes, set parent mesh info right after construction * Renamed GenericSTKMeshStruct method to better reflect what it does --- src/disc/Albany_AbstractMeshStruct.hpp | 3 +- src/disc/Albany_DiscretizationFactory.cpp | 123 +++++++++++++---- src/disc/Albany_DiscretizationFactory.hpp | 2 +- src/disc/omegah/Albany_OmegahGenericMesh.cpp | 3 +- src/disc/omegah/Albany_OmegahGenericMesh.hpp | 3 +- src/disc/stk/Albany_AbstractSTKMeshStruct.hpp | 4 - src/disc/stk/Albany_AsciiSTKMesh2D.cpp | 8 -- src/disc/stk/Albany_AsciiSTKMeshStruct.cpp | 8 -- src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 7 - src/disc/stk/Albany_GenericSTKMeshStruct.cpp | 126 +++--------------- src/disc/stk/Albany_GenericSTKMeshStruct.hpp | 19 +-- src/disc/stk/Albany_GmshSTKMeshStruct.cpp | 8 -- src/disc/stk/Albany_IossSTKMeshStruct.cpp | 13 +- src/disc/stk/Albany_IossSTKMeshStruct.hpp | 3 +- src/disc/stk/Albany_STK3DPointStruct.cpp | 6 - src/disc/stk/Albany_STKDiscretization.cpp | 3 +- src/disc/stk/Albany_SideSetSTKMeshStruct.cpp | 6 +- src/disc/stk/Albany_TmplSTKMeshStruct.hpp | 3 +- src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp | 23 +--- 19 files changed, 134 insertions(+), 237 deletions(-) diff --git a/src/disc/Albany_AbstractMeshStruct.hpp b/src/disc/Albany_AbstractMeshStruct.hpp index 80534cf27d..5029259917 100644 --- a/src/disc/Albany_AbstractMeshStruct.hpp +++ b/src/disc/Albany_AbstractMeshStruct.hpp @@ -37,8 +37,7 @@ struct AbstractMeshStruct { virtual std::string meshType() const = 0; virtual void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}) = 0; + const Teuchos::RCP& sis) = 0; virtual void setBulkData(const Teuchos::RCP& comm) = 0; diff --git a/src/disc/Albany_DiscretizationFactory.cpp b/src/disc/Albany_DiscretizationFactory.cpp index ebe9523c32..5b74059cb5 100644 --- a/src/disc/Albany_DiscretizationFactory.cpp +++ b/src/disc/Albany_DiscretizationFactory.cpp @@ -60,22 +60,23 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis Teuchos::RCP comm, const int numParams) { std::string& method = disc_params->get("Method", "STK1D"); + Teuchos::RCP mesh; if (method == "STK1D") { - return Teuchos::rcp(new TmplSTKMeshStruct<1>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new TmplSTKMeshStruct<1>(disc_params, comm, numParams)); } else if (method == "STK0D") { - return Teuchos::rcp(new TmplSTKMeshStruct<0>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new TmplSTKMeshStruct<0>(disc_params, comm, numParams)); } else if (method == "STK2D") { - return Teuchos::rcp(new TmplSTKMeshStruct<2>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new TmplSTKMeshStruct<2>(disc_params, comm, numParams)); } else if (method == "STK3D") { - return Teuchos::rcp(new TmplSTKMeshStruct<3>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new TmplSTKMeshStruct<3>(disc_params, comm, numParams)); } else if (method == "STK3D") { - return Teuchos::rcp(new TmplSTKMeshStruct<3>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new TmplSTKMeshStruct<3>(disc_params, comm, numParams)); } else if (method == "STK3DPoint") { - return Teuchos::rcp(new STK3DPointStruct(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new STK3DPointStruct(disc_params, comm, numParams)); } else if (method == "Ioss" || method == "Exodus" || method == "Pamgen") { #ifdef ALBANY_SEACAS - return Teuchos::rcp(new IossSTKMeshStruct(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new IossSTKMeshStruct(disc_params, comm, numParams)); #else TEUCHOS_TEST_FOR_EXCEPTION(method == "Ioss" || method == "Exodus" || method == "Pamgen", Teuchos::Exceptions::InvalidParameter, @@ -85,17 +86,17 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis } #ifdef ALBANY_OMEGAH else if (method == "Box1D") { - return Teuchos::rcp(new OmegahBoxMesh<1>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new OmegahBoxMesh<1>(disc_params, comm, numParams)); } else if (method == "Box2D") { - return Teuchos::rcp(new OmegahBoxMesh<2>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new OmegahBoxMesh<2>(disc_params, comm, numParams)); } else if (method == "Box3D") { - return Teuchos::rcp(new OmegahBoxMesh<3>(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new OmegahBoxMesh<3>(disc_params, comm, numParams)); } #endif else if (method == "Ascii") { - return Teuchos::rcp(new AsciiSTKMeshStruct(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new AsciiSTKMeshStruct(disc_params, comm, numParams)); } else if (method == "Ascii2D") { - return Teuchos::rcp(new AsciiSTKMesh2D(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new AsciiSTKMesh2D(disc_params, comm, numParams)); #ifdef ALBANY_SEACAS // Fails to compile without SEACAS } else if (method == "Hacky Ascii2D") { //FixME very hacky! needed for printing 2d mesh @@ -112,7 +113,7 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis mesh_data->process_output_request(idx, 0.0); #endif // ALBANY_SEACAS } else if (method == "Gmsh") { - return Teuchos::rcp(new GmshSTKMeshStruct(disc_params, comm, numParams)); + mesh = Teuchos::rcp(new GmshSTKMeshStruct(disc_params, comm, numParams)); } else if (method == "Extruded") { Teuchos::RCP basalMesh; @@ -140,24 +141,85 @@ DiscretizationFactory::createMeshStruct(Teuchos::RCP dis } basalMesh = createMeshStruct(basal_params, comm, numParams); - return Teuchos::rcp(new ExtrudedSTKMeshStruct(disc_params, comm, basalMesh, numParams)); + mesh = Teuchos::rcp(new ExtrudedSTKMeshStruct(disc_params, comm, basalMesh, numParams)); } else if (method == "Cubit") { TEUCHOS_TEST_FOR_EXCEPTION(method == "Cubit", Teuchos::Exceptions::InvalidParameter, "Error: Discretization method " << method << " requested, but no longer supported as of 10/2017" << std::endl); - } else + } else { TEUCHOS_TEST_FOR_EXCEPTION(true, Teuchos::Exceptions::InvalidParameter, std::endl << "Error! Unknown discretization method in DiscretizationFactory: " << method << "!" << std::endl << "Supplied parameter list is " << std::endl << *disc_params << "\nValid Methods are: STK1D, STK2D, STK3D, STK3DPoint, Ioss," << " Exodus, Ascii," << " Ascii2D, Extruded" << std::endl); + } - return Teuchos::null; -} + if (disc_params->isSublist ("Side Set Discretizations")) { + TEUCHOS_TEST_FOR_EXCEPTION (mesh->meshSpecs.size()!=1, std::logic_error, + "Error! So far, side set mesh is allowed only for meshes with 1 element block.\n"); + auto ms = mesh->meshSpecs[0]; + + const Teuchos::ParameterList& ssd_list = disc_params->sublist("Side Set Discretizations"); + const Teuchos::Array& sideSets = ssd_list.get >("Side Sets"); + + Teuchos::RCP params_ss; + int sideDim = ms->numDim - 1; + for (int i(0); isideSetMeshStructs[ss_name]; + + // If this is the basalside of an extruded mesh, we already created the mesh object + if (ss_mesh.is_null()) { + params_ss = Teuchos::rcp(new Teuchos::ParameterList(ssd_list.sublist(ss_name))); + + if (!params_ss->isParameter("Number Of Time Derivatives")) + params_ss->set("Number Of Time Derivatives",disc_params->get("Number Of Time Derivatives")); + + // Set sideset discretization workset size based on sideset mesh spec if a single workset is used + const auto &sideSetMeshSpecs = ms->sideSetMeshSpecs; + auto sideSetMeshSpecIter = sideSetMeshSpecs.find(ss_name); + TEUCHOS_TEST_FOR_EXCEPTION(sideSetMeshSpecIter == sideSetMeshSpecs.end(), std::runtime_error, + "Cannot find " << ss_name << " in sideSetMeshSpecs!\n"); + + std::string ss_method = params_ss->get("Method"); + if (ss_method=="SideSetSTK") { + ss_mesh = Teuchos::rcp(new SideSetSTKMeshStruct(*ms, params_ss, comm, numParams)); + + auto mesh_stk = Teuchos::rcp_dynamic_cast(mesh,true); + auto ss_mesh_stk = Teuchos::rcp_dynamic_cast(ss_mesh,true); + ss_mesh_stk->setParentMeshInfo(*mesh_stk, ss_name); + + // If requested, we ignore the side maps already stored in the imported side mesh (if any) + // This can be useful for side mesh of an extruded mesh, in the case it was constructed + // as side mesh of an extruded mesh with a different ordering and/or different number + // of layers. Notice that if that's the case, it probably is impossible to build a new + // set of maps, since there is no way to correctly map the side nodes to the cell nodes. + ss_mesh_stk->ignore_side_maps = params_ss->get("Ignore Side Maps", false); + } else { + // This can be the case if we restart from existing volume and side meshes + ss_mesh = createMeshStruct (params_ss,comm, numParams); + } + } + + auto ss_ms = ss_mesh->meshSpecs; + + // Checking that the side mesh has the correct dimension (in case they were loaded from file, + // and the user mistakenly gave the wrong file name) + TEUCHOS_TEST_FOR_EXCEPTION (sideDim!=ss_ms[0]->numDim, std::logic_error, + "Error! Mesh on side " << ss_name << " has the wrong dimension.\n"); + } + auto stk_mesh = Teuchos::rcp_dynamic_cast(mesh); + if (stk_mesh) + stk_mesh->createSideMeshMaps(); + } + + return mesh; +} Teuchos::RCP DiscretizationFactory::createDiscretization( @@ -207,29 +269,34 @@ DiscretizationFactory::setMeshStructFieldData( const Teuchos::RCP& sis, const std::map >& side_set_sis) { - TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructFieldData"); - meshStruct->setFieldData(comm, sis, side_set_sis); + TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructFieldData"); + meshStruct->setFieldData(comm, sis); + for (auto& it : meshStruct->sideSetMeshStructs) { + auto this_ss_sis = side_set_sis.count(it.first)>0 ? side_set_sis.at(it.first) : Teuchos::null; + it.second->setFieldData(comm,this_ss_sis); + } } void DiscretizationFactory:: setMeshStructBulkData() { - TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructBulkData"); - meshStruct->setBulkData(comm); + TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructBulkData"); + meshStruct->setBulkData(comm); + for (auto& it : meshStruct->sideSetMeshStructs) { + it.second->setBulkData(comm); + } } - Teuchos::RCP DiscretizationFactory::createDiscretizationFromInternalMeshStruct( const int neq, const std::map >& sideSetEquations, - const Teuchos::RCP& rigidBodyModes) { - TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: createDiscretizationFromInternalMeshStruct"); - - if (!piroParams.is_null() && !rigidBodyModes.is_null()) - - rigidBodyModes->setPiroPL(piroParams); + const Teuchos::RCP& rigidBodyModes) +{ + TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: createDiscretizationFromInternalMeshStruct"); + if (!piroParams.is_null() && !rigidBodyModes.is_null()) + rigidBodyModes->setPiroPL(piroParams); Teuchos::RCP disc; if (meshStruct->meshType()=="STK") { diff --git a/src/disc/Albany_DiscretizationFactory.hpp b/src/disc/Albany_DiscretizationFactory.hpp index 29ad2f1537..302d3c588a 100644 --- a/src/disc/Albany_DiscretizationFactory.hpp +++ b/src/disc/Albany_DiscretizationFactory.hpp @@ -35,7 +35,7 @@ class DiscretizationFactory { //! Destructor ~DiscretizationFactory() {} - static Teuchos::RCP + Teuchos::RCP createMeshStruct (Teuchos::RCP disc_params, Teuchos::RCP comm, const int numParams); diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.cpp b/src/disc/omegah/Albany_OmegahGenericMesh.cpp index 9d203ca6d1..4149a3f45b 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.cpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.cpp @@ -6,8 +6,7 @@ namespace Albany void OmegahGenericMesh:: setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) + const Teuchos::RCP& sis) { m_field_accessor = Teuchos::rcp(new OmegahMeshFieldAccessor(m_mesh)); if (not sis.is_null()) { diff --git a/src/disc/omegah/Albany_OmegahGenericMesh.hpp b/src/disc/omegah/Albany_OmegahGenericMesh.hpp index dc94e07f4a..4dd1f5ab5d 100644 --- a/src/disc/omegah/Albany_OmegahGenericMesh.hpp +++ b/src/disc/omegah/Albany_OmegahGenericMesh.hpp @@ -19,8 +19,7 @@ class OmegahGenericMesh : public AbstractMeshStruct { std::string meshType () const override { return "Omega_h"; } void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) override; + const Teuchos::RCP& sis) override; // ------------- Omegah specific methods -------------- // diff --git a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp index 61d5f7b6c2..7f2afb16e6 100644 --- a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp @@ -163,10 +163,6 @@ struct AbstractSTKMeshStruct : public AbstractMeshStruct // Info for periodic BCs -- only for hand-coded STK meshes struct PeriodicBCStruct PBCStruct; - std::map> sideSetMeshStructs; - - bool fieldDataSet = false; - bool bulkDataSet = false; virtual void buildCellSideNodeNumerationMap( diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp index 1ca2523ea1..61942fe0b8 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp @@ -294,9 +294,6 @@ AsciiSTKMesh2D (const Teuchos::RCP& params, // Create a mesh specs object for EACH side set this->initializeSideSetMeshSpecs(comm); - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } void AsciiSTKMesh2D:: @@ -428,11 +425,6 @@ setBulkData (const Teuchos::RCP& comm) // Loading required input fields from file this->loadRequiredInputFields (comm); - - // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(comm); - - bulkDataSet = true; } Teuchos::RCP diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp index 3e051260c6..6bb1633b1f 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp @@ -399,12 +399,8 @@ AsciiSTKMeshStruct(const Teuchos::RCP& params, nsNames, ssNames, worksetSize, ebn, ebNameToIndex)); - // Create a mesh specs object for EACH side set this->initializeSideSetMeshSpecs(comm); - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } AsciiSTKMeshStruct::~AsciiSTKMeshStruct() @@ -704,10 +700,6 @@ setBulkData (const Teuchos::RCP& comm) fix_node_sharing(*bulkData); bulkData->modification_end(); - - bulkDataSet = true; - - this->setSideSetBulkData(comm); } Teuchos::RCP diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 116ff95864..6f808407bb 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -187,9 +187,6 @@ ExtrudedSTKMeshStruct(const Teuchos::RCP& params, // Create a mesh specs object for EACH side set this->initializeSideSetMeshSpecs(comm); - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } void ExtrudedSTKMeshStruct:: @@ -563,14 +560,10 @@ setBulkData (const Teuchos::RCP& comm) //fix_node_sharing(*bulkData); bulkData->modification_end(); - bulkDataSet = true; // Check that the nodeset created from sidesets contain the right number of nodes this->checkNodeSetsFromSideSetsIntegrity (); - // We can finally extract the side set meshes and set the fields and bulk data in all of them - this->setSideSetBulkData(comm); - if (params->get("Export 2D Data",false)) { // We export the basal mesh in GMSH format std::ofstream ofile; diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp index a152c29714..8d4051182e 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.cpp @@ -77,8 +77,7 @@ GenericSTKMeshStruct::GenericSTKMeshStruct( void GenericSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) + const Teuchos::RCP& sis) { TEUCHOS_TEST_FOR_EXCEPTION(!metaData->is_initialized(), std::logic_error, "[GenericSTKMeshStruct::SetupFieldData] metaData->initialize(numDim) not yet called" << std::endl); @@ -159,10 +158,6 @@ setFieldData (const Teuchos::RCP& comm, writeCoordsToMMFile = params->get("Write Coordinates to MatrixMarket", false); transferSolutionToCoords = params->get("Transfer Solution to Coordinates", false); - - fieldDataSet = true; - - this->setSideSetFieldData(comm, side_set_sis); } void GenericSTKMeshStruct::setAllPartsIO() @@ -462,109 +457,26 @@ void GenericSTKMeshStruct::initializeSideSetMeshSpecs (const Teuchos::RCP& comm) +void GenericSTKMeshStruct::createSideMeshMaps () { - if (params->isSublist ("Side Set Discretizations")) { - const Teuchos::ParameterList& ssd_list = params->sublist("Side Set Discretizations"); - const Teuchos::Array& sideSets = ssd_list.get >("Side Sets"); - - Teuchos::RCP params_ss; - int sideDim = this->numDim - 1; - for (int i(0); i ss_mesh; - const std::string& ss_name = sideSets[i]; - params_ss = Teuchos::rcp(new Teuchos::ParameterList(ssd_list.sublist(ss_name))); - - // We must check whether a side mesh was already created elsewhere. - // If the mesh already exists, we do nothing, and we ASSUME it is a valid mesh - // This happens, for instance, for the basal mesh for extruded meshes. - if (this->sideSetMeshStructs.find(ss_name)==this->sideSetMeshStructs.end()) { - if (!params_ss->isParameter("Number Of Time Derivatives")) - params_ss->set("Number Of Time Derivatives",num_time_deriv); - - // Set sideset discretization workset size based on sideset mesh spec if a single workset is used - const auto &sideSetMeshSpecs = this->meshSpecs[0]->sideSetMeshSpecs; - auto sideSetMeshSpecIter = sideSetMeshSpecs.find(ss_name); - TEUCHOS_TEST_FOR_EXCEPTION(sideSetMeshSpecIter == sideSetMeshSpecs.end(), std::runtime_error, - "Cannot find " << ss_name << " in sideSetMeshSpecs!\n"); - - std::string method = params_ss->get("Method"); - if (method=="SideSetSTK") { - // The user said this mesh is extracted from a higher dimensional one - TEUCHOS_TEST_FOR_EXCEPTION (meshSpecs.size()!=1, std::logic_error, - "Error! So far, side set mesh extraction is allowed only from STK meshes with 1 element block.\n"); - - this->sideSetMeshStructs[ss_name] = - Teuchos::rcp(new SideSetSTKMeshStruct( - *this->meshSpecs[0], params_ss, comm, num_params)); - } else { - ss_mesh = DiscretizationFactory::createMeshStruct (params_ss,comm, num_params); - this->sideSetMeshStructs[ss_name] = Teuchos::rcp_dynamic_cast(ss_mesh,false); - TEUCHOS_TEST_FOR_EXCEPTION (this->sideSetMeshStructs[ss_name]==Teuchos::null, std::runtime_error, - "Error! Could not cast side mesh to AbstractSTKMeshStruct.\n"); - } - } - - // Checking that the side meshes have the correct dimension (in case they were loaded from file, - // and the user mistakenly gave the wrong file name) - TEUCHOS_TEST_FOR_EXCEPTION (sideDim!=this->sideSetMeshStructs[ss_name]->numDim, std::logic_error, - "Error! Mesh on side " << ss_name << " has the wrong dimension.\n"); - - // Update the side set mesh specs pointer in the mesh specs of this mesh - this->meshSpecs[0]->sideSetMeshSpecs[ss_name] = this->sideSetMeshStructs[ss_name]->meshSpecs; - this->meshSpecs[0]->sideSetMeshNames.push_back(ss_name); - - // We need to create the 2D cell -> (3D cell, side_node_ids) map in the side mesh now - using ISFT = AbstractSTKFieldContainer::STKIntState; - ISFT* side_to_cell_map = &this->sideSetMeshStructs[ss_name]->metaData->declare_field (stk::topology::ELEM_RANK, "side_to_cell_map"); - stk::mesh::put_field_on_mesh(*side_to_cell_map, this->sideSetMeshStructs[ss_name]->metaData->universal_part(), 1, nullptr); + for (auto& it : sideSetMeshStructs) { + auto ss_stk_mesh = Teuchos::rcp_dynamic_cast(it.second,true); + auto ss_ms = ss_stk_mesh->meshSpecs[0]; + + // We need to create the 2D cell -> (3D cell, side_node_ids) map in the side mesh now + using ISFT = AbstractSTKFieldContainer::STKIntState; + ISFT* side_to_cell_map = &ss_stk_mesh->metaData->declare_field (stk::topology::ELEM_RANK, "side_to_cell_map"); + stk::mesh::put_field_on_mesh(*side_to_cell_map, ss_stk_mesh->metaData->universal_part(), 1, nullptr); #ifdef ALBANY_SEACAS - stk::io::set_field_role(*side_to_cell_map, Ioss::Field::TRANSIENT); + stk::io::set_field_role(*side_to_cell_map, Ioss::Field::TRANSIENT); #endif - // We need to create the 2D cell -> (3D cell, side_node_ids) map in the side mesh now - const int num_nodes = sideSetMeshStructs[ss_name]->meshSpecs[0]->ctd.node_count; - ISFT* side_nodes_ids = &this->sideSetMeshStructs[ss_name]->metaData->declare_field (stk::topology::ELEM_RANK, "side_nodes_ids"); - stk::mesh::put_field_on_mesh(*side_nodes_ids, this->sideSetMeshStructs[ss_name]->metaData->universal_part(), num_nodes, nullptr); + // We need to create the 2D cell -> (3D cell, side_node_ids) map in the side mesh now + const int num_nodes = ss_ms->ctd.node_count; + ISFT* side_nodes_ids = &ss_stk_mesh->metaData->declare_field (stk::topology::ELEM_RANK, "side_nodes_ids"); + stk::mesh::put_field_on_mesh(*side_nodes_ids, ss_stk_mesh->metaData->universal_part(), num_nodes, nullptr); #ifdef ALBANY_SEACAS - stk::io::set_field_role(*side_nodes_ids, Ioss::Field::TRANSIENT); + stk::io::set_field_role(*side_nodes_ids, Ioss::Field::TRANSIENT); #endif - - // If requested, we ignore the side maps already stored in the imported side mesh (if any) - // This can be useful for side mesh of an extruded mesh, in the case it was constructed - // as side mesh of an extruded mesh with a different ordering and/or different number - // of layers. Notice that if that's the case, it probably is impossible to build a new - // set of maps, since there is no way to correctly map the side nodes to the cell nodes. - this->sideSetMeshStructs[ss_name]->ignore_side_maps = params_ss->get("Ignore Side Maps", false); - } - } -} - -void GenericSTKMeshStruct:: -setSideSetFieldData (const Teuchos::RCP& comm, - const std::map >& side_set_sis) -{ - for (auto it : sideSetMeshStructs) { - auto sideMesh = Teuchos::rcp_dynamic_cast(it.second,false); - if (sideMesh!=Teuchos::null) { - // SideSetSTK mesh need to build the mesh - sideMesh->setParentMeshInfo(*this, it.first); - } - - if (not it.second->fieldDataSet) { - auto sis = side_set_sis.count(it.first)>0 ? side_set_sis.at(it.first) : Teuchos::null; - it.second->setFieldData(comm,sis); - } - } -} - -void GenericSTKMeshStruct:: -setSideSetBulkData (const Teuchos::RCP& comm) -{ - for (auto it : sideSetMeshStructs) { - if (not it.second->bulkDataSet) { - it.second->setBulkData(comm); - } } } @@ -576,7 +488,7 @@ buildCellSideNodeNumerationMap (const std::string& sideSetName, TEUCHOS_TEST_FOR_EXCEPTION (sideSetMeshStructs.count(sideSetName)==0, Teuchos::Exceptions::InvalidParameter, "Error in 'buildCellSideNodeNumerationMap': side set " << sideSetName << " does not have a mesh.\n"); - Teuchos::RCP side_mesh = sideSetMeshStructs.at(sideSetName); + auto side_mesh = Teuchos::rcp_dynamic_cast(sideSetMeshStructs.at(sideSetName)); // NOTE 1: the stk fields memorize maps from 2D to 3D values (since fields are defined on 2D mesh), while the input // maps map 3D values to 2D ones. For instance, if node 0 of side3D 41 is mapped to node 2 of cell2D 12, the @@ -604,8 +516,8 @@ buildCellSideNodeNumerationMap (const std::string& sideSetName, int side_lid; int num_sides; using ISFT = AbstractSTKFieldContainer::STKIntState; - ISFT* side_to_cell_map = this->sideSetMeshStructs[sideSetName]->metaData->get_field (stk::topology::ELEM_RANK, "side_to_cell_map"); - ISFT* side_nodes_ids_map = this->sideSetMeshStructs[sideSetName]->metaData->get_field (stk::topology::ELEM_RANK, "side_nodes_ids"); + ISFT* side_to_cell_map = side_mesh->metaData->get_field (stk::topology::ELEM_RANK, "side_to_cell_map"); + ISFT* side_nodes_ids_map = side_mesh->metaData->get_field (stk::topology::ELEM_RANK, "side_nodes_ids"); std::vector cell2D_nodes_ids(num_nodes), side3D_nodes_ids(num_nodes); const stk::mesh::Entity* side3D_nodes; const stk::mesh::Entity* cell2D_nodes; diff --git a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp index 39987cb3ac..30678164ad 100644 --- a/src/disc/stk/Albany_GenericSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_GenericSTKMeshStruct.hpp @@ -40,8 +40,7 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct int getNumParams() const {return num_params; } void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis); + const Teuchos::RCP& sis); void printParts(stk::mesh::MetaData *metaData); @@ -66,21 +65,7 @@ class GenericSTKMeshStruct : public AbstractSTKMeshStruct //! Creates empty mesh structs if required (and not already present) void initializeSideSetMeshSpecs (const Teuchos::RCP& comm); - //! Creates empty mesh structs if required (and not already present) - void initializeSideSetMeshStructs (const Teuchos::RCP& comm); - - //! Completes the creation of the side set mesh structs (if of type SideSetSTKMeshStruct) - void setSideSetFieldData (const Teuchos::RCP& comm, - const std::map >& side_set_sis); - - void setSideSetBulkData (const Teuchos::RCP& comm); - - void setSideSetFieldAndBulkData(const Teuchos::RCP& comm, - const std::map >& side_set_sis) - { - setSideSetFieldData(comm, side_set_sis); - setSideSetBulkData(comm); - } + void createSideMeshMaps (); //! Loads from file input required fields not found in the mesh void loadRequiredInputFields (const Teuchos::RCP& comm); diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp index 3038cf7825..7a48217cce 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp @@ -126,9 +126,6 @@ GmshSTKMeshStruct (const Teuchos::RCP& params, // Create a mesh specs object for EACH side set this->initializeSideSetMeshSpecs(comm); - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } GmshSTKMeshStruct::~GmshSTKMeshStruct() @@ -357,11 +354,6 @@ setBulkData (const Teuchos::RCP& comm) // Loading required input fields from file this->loadRequiredInputFields (comm); - - // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(comm); - - bulkDataSet = true; } Teuchos::RCP GmshSTKMeshStruct::getValidDiscretizationParameters() const diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index 5019a30a0f..6582e5fb42 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -254,9 +254,6 @@ IossSTKMeshStruct(const Teuchos::RCP& params_, } } } - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } IossSTKMeshStruct::~IossSTKMeshStruct() @@ -280,10 +277,9 @@ IossSTKMeshStruct::~IossSTKMeshStruct() void IossSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) + const Teuchos::RCP& sis) { - GenericSTKMeshStruct::setFieldData(comm, sis, side_set_sis); + GenericSTKMeshStruct::setFieldData(comm, sis); if(mesh_data->is_bulk_data_null()) mesh_data->set_bulk_data(*bulkData); @@ -332,7 +328,6 @@ setFieldData (const Teuchos::RCP& comm, } } - fieldDataSet = true; } void IossSTKMeshStruct:: @@ -479,10 +474,6 @@ setBulkData (const Teuchos::RCP& comm) // Check that the nodeset created from sidesets contain the right number of nodes this->checkNodeSetsFromSideSetsIntegrity (); - // Finally, perform the setup of the (possible) side set meshes (including extraction if of type SideSetSTKMeshStruct) - this->setSideSetBulkData(comm); - - bulkDataSet = true; } void diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.hpp b/src/disc/stk/Albany_IossSTKMeshStruct.hpp index 34e0e323ce..cedb4511df 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.hpp @@ -29,8 +29,7 @@ namespace Albany { ~IossSTKMeshStruct(); void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); + const Teuchos::RCP& sis); void setBulkData (const Teuchos::RCP& comm); diff --git a/src/disc/stk/Albany_STK3DPointStruct.cpp b/src/disc/stk/Albany_STK3DPointStruct.cpp index 25ba187560..45f9cc1f79 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.cpp +++ b/src/disc/stk/Albany_STK3DPointStruct.cpp @@ -45,9 +45,6 @@ STK3DPointStruct(const Teuchos::RCP& params, // Create a mesh specs object for EACH side set this->initializeSideSetMeshSpecs(comm); - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } void STK3DPointStruct:: @@ -69,9 +66,6 @@ setBulkData (const Teuchos::RCP& comm) bulkData->declare_relation(pt, node, 0); bulkData->modification_end(); - - bulkDataSet = true; - this->setSideSetBulkData(comm); } void diff --git a/src/disc/stk/Albany_STKDiscretization.cpp b/src/disc/stk/Albany_STKDiscretization.cpp index dc885f3af9..1a76d8fff4 100644 --- a/src/disc/stk/Albany_STKDiscretization.cpp +++ b/src/disc/stk/Albany_STKDiscretization.cpp @@ -76,7 +76,8 @@ STKDiscretization::STKDiscretization( { if (stkMeshStruct->sideSetMeshStructs.size() > 0) { for (auto it : stkMeshStruct->sideSetMeshStructs) { - auto side_disc = Teuchos::rcp(new STKDiscretization(discParams, neq, it.second, comm)); + auto stk_mesh = Teuchos::rcp_dynamic_cast(it.second,true); + auto side_disc = Teuchos::rcp(new STKDiscretization(discParams, neq, stk_mesh, comm)); sideSetDiscretizations.insert(std::make_pair(it.first, side_disc)); sideSetDiscretizationsSTK.insert(std::make_pair(it.first, side_disc)); } diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp index 4f26f345af..87fa8ddce1 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp @@ -199,13 +199,11 @@ setBulkData (const Teuchos::RCP& comm) } } - // Loading the fields from file - this->loadRequiredInputFields (comm); - // Insertion of entities end bulkData->modification_end(); - bulkDataSet = true; + // Loading the fields from file + this->loadRequiredInputFields (comm); } Teuchos::RCP SideSetSTKMeshStruct::getValidDiscretizationParameters() const diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp index a39567e560..17458cf169 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct.hpp @@ -93,8 +93,7 @@ class TmplSTKMeshStruct : public GenericSTKMeshStruct { //! Sets mesh generation parameters void setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis = {}); + const Teuchos::RCP& sis); void setBulkData (const Teuchos::RCP& comm); diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp index 87764aaced..c46f239853 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp @@ -279,13 +279,11 @@ TmplSTKMeshStruct::TmplSTKMeshStruct( } // Construct MeshSpecsStruct - { - const CellTopologyData& ctd = *elementBlockTopologies_[0].getCellTopologyData(); + const CellTopologyData& ctd = *elementBlockTopologies_[0].getCellTopologyData(); - this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct(ctd, numDim, - nsNames, ssNames, worksetSize, EBSpecs[0].name, - ebNameToIndex)); - } + this->meshSpecs[0] = Teuchos::rcp(new MeshSpecsStruct(ctd, numDim, + nsNames, ssNames, worksetSize, EBSpecs[0].name, + ebNameToIndex)); // Upon request, add a nodeset for each sideset if (params->get("Build Node Sets From Side Sets",false)) { @@ -294,17 +292,13 @@ TmplSTKMeshStruct::TmplSTKMeshStruct( // Create a mesh specs object for EACH side set this->initializeSideSetMeshSpecs(comm); - - // Initialize the requested sideset mesh struct in the mesh - this->initializeSideSetMeshStructs(comm); } template void TmplSTKMeshStruct:: setFieldData (const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const std::map >& side_set_sis) + const Teuchos::RCP& sis) { // Create global mesh: Dim-D structured, rectangular std::vector h_dim[traits_type::size]; @@ -324,7 +318,7 @@ setFieldData (const Teuchos::RCP& comm, x[idx][i] = x[idx][i - 1] + h_dim[idx][i - 1]; // place the coordinates of the element nodes } - GenericSTKMeshStruct::setFieldData(comm, sis, side_set_sis); + GenericSTKMeshStruct::setFieldData(comm, sis); } template @@ -345,11 +339,6 @@ setBulkData (const Teuchos::RCP& comm) // Rebalance the mesh before starting the simulation if indicated rebalanceInitialMesh(comm); - - bulkDataSet = true; - - // Finally, setup the side set meshes (if any) - this->setSideSetBulkData(comm); } template From 806d68d896e8dc98eb6c9a228ebcaee75c908664 Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Tue, 19 Dec 2023 11:15:35 -0700 Subject: [PATCH 10/12] Make sure bulk data is only set once --- src/disc/Albany_AbstractMeshStruct.hpp | 5 +++++ src/disc/Albany_DiscretizationFactory.cpp | 7 ++++++- src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp | 2 +- src/disc/omegah/Albany_OmegahOshMesh.hpp | 1 + src/disc/stk/Albany_AbstractSTKMeshStruct.hpp | 2 +- src/disc/stk/Albany_AsciiSTKMesh2D.cpp | 2 ++ src/disc/stk/Albany_AsciiSTKMeshStruct.cpp | 2 ++ src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp | 9 +++++++-- src/disc/stk/Albany_GmshSTKMeshStruct.cpp | 2 ++ src/disc/stk/Albany_IossSTKMeshStruct.cpp | 1 + src/disc/stk/Albany_STK3DPointStruct.cpp | 2 ++ src/disc/stk/Albany_SideSetSTKMeshStruct.cpp | 2 ++ src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp | 4 ++++ 13 files changed, 36 insertions(+), 5 deletions(-) diff --git a/src/disc/Albany_AbstractMeshStruct.hpp b/src/disc/Albany_AbstractMeshStruct.hpp index 5029259917..f01fbfebff 100644 --- a/src/disc/Albany_AbstractMeshStruct.hpp +++ b/src/disc/Albany_AbstractMeshStruct.hpp @@ -41,12 +41,17 @@ struct AbstractMeshStruct { virtual void setBulkData(const Teuchos::RCP& comm) = 0; + bool isBulkDataSet () const { return m_bulk_data_set; } + Teuchos::RCP > global_cell_layers_data; Teuchos::RCP > local_cell_layers_data; Teuchos::ArrayRCP mesh_layers_ratio; Teuchos::ArrayRCP > meshSpecs; std::map> sideSetMeshStructs; + protected: + + bool m_bulk_data_set = false; }; } // Namespace Albany diff --git a/src/disc/Albany_DiscretizationFactory.cpp b/src/disc/Albany_DiscretizationFactory.cpp index 5b74059cb5..8831f1a023 100644 --- a/src/disc/Albany_DiscretizationFactory.cpp +++ b/src/disc/Albany_DiscretizationFactory.cpp @@ -283,7 +283,12 @@ setMeshStructBulkData() TEUCHOS_FUNC_TIME_MONITOR("Albany_DiscrFactory: setMeshStructBulkData"); meshStruct->setBulkData(comm); for (auto& it : meshStruct->sideSetMeshStructs) { - it.second->setBulkData(comm); + // For extruded meshes, the bulk data of the basal mesh + // should be set from inside the extruded mesh call, + // during the 'setBulkData' call above + if (not it.second->isBulkDataSet()) { + it.second->setBulkData(comm); + } } } diff --git a/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp b/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp index fac497cd38..dc5fe26afc 100644 --- a/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp +++ b/src/disc/omegah/Albany_OmegahBoxMesh_Def.hpp @@ -145,7 +145,7 @@ template void OmegahBoxMesh:: setBulkData (const Teuchos::RCP& /* comm */) { - // Nothing to do here + m_bulk_data_set = true; } template diff --git a/src/disc/omegah/Albany_OmegahOshMesh.hpp b/src/disc/omegah/Albany_OmegahOshMesh.hpp index 8ad4f11482..4345e8f650 100644 --- a/src/disc/omegah/Albany_OmegahOshMesh.hpp +++ b/src/disc/omegah/Albany_OmegahOshMesh.hpp @@ -14,6 +14,7 @@ class OmegahOshMesh : public OmegahGenericMesh void setBulkData (const Teuchos::RCP& comm) { throw NotYetImplemented("OmegahOshMesh::setBulkData"); + m_bulk_data_set = true; } }; diff --git a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp index 7f2afb16e6..c519e276b3 100644 --- a/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp +++ b/src/disc/stk/Albany_AbstractSTKMeshStruct.hpp @@ -45,7 +45,7 @@ struct AbstractSTKMeshStruct : public AbstractMeshStruct virtual ~AbstractSTKMeshStruct() = default; public: - std::string meshType () const { return "STK"; } + std::string meshType () const override { return "STK"; } Teuchos::RCP metaData; Teuchos::RCP bulkData; diff --git a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp index 61942fe0b8..a099a25eef 100644 --- a/src/disc/stk/Albany_AsciiSTKMesh2D.cpp +++ b/src/disc/stk/Albany_AsciiSTKMesh2D.cpp @@ -425,6 +425,8 @@ setBulkData (const Teuchos::RCP& comm) // Loading required input fields from file this->loadRequiredInputFields (comm); + + m_bulk_data_set = true; } Teuchos::RCP diff --git a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp index 6bb1633b1f..d2d31f1349 100644 --- a/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_AsciiSTKMeshStruct.cpp @@ -700,6 +700,8 @@ setBulkData (const Teuchos::RCP& comm) fix_node_sharing(*bulkData); bulkData->modification_end(); + + m_bulk_data_set = true; } Teuchos::RCP diff --git a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp index 6f808407bb..bf0e0b89ad 100644 --- a/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_ExtrudedSTKMeshStruct.cpp @@ -196,8 +196,11 @@ setBulkData (const Teuchos::RCP& comm) constexpr auto NODE_RANK = stk::topology::NODE_RANK; const auto SIDE_RANK = metaData->side_rank(); - // Finish to set up the basal mesh (we need this to be completed before building 3d entities) - this->sideSetMeshStructs.at("basalside")->setBulkData (comm); + // This code should always run, but just in case something changes, + // let's first check that bulk data was not set yet + if (not basalMeshStruct->isBulkDataSet()) { + basalMeshStruct->setBulkData (comm); + } constexpr auto LAYER = LayeredMeshOrdering::LAYER; @@ -625,6 +628,8 @@ setBulkData (const Teuchos::RCP& comm) ofile.close(); } + + m_bulk_data_set = true; } void ExtrudedSTKMeshStruct:: diff --git a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp index 7a48217cce..59a969ddd5 100644 --- a/src/disc/stk/Albany_GmshSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_GmshSTKMeshStruct.cpp @@ -354,6 +354,8 @@ setBulkData (const Teuchos::RCP& comm) // Loading required input fields from file this->loadRequiredInputFields (comm); + + m_bulk_data_set = true; } Teuchos::RCP GmshSTKMeshStruct::getValidDiscretizationParameters() const diff --git a/src/disc/stk/Albany_IossSTKMeshStruct.cpp b/src/disc/stk/Albany_IossSTKMeshStruct.cpp index 6582e5fb42..9ab0f73b71 100644 --- a/src/disc/stk/Albany_IossSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_IossSTKMeshStruct.cpp @@ -474,6 +474,7 @@ setBulkData (const Teuchos::RCP& comm) // Check that the nodeset created from sidesets contain the right number of nodes this->checkNodeSetsFromSideSetsIntegrity (); + m_bulk_data_set = true; } void diff --git a/src/disc/stk/Albany_STK3DPointStruct.cpp b/src/disc/stk/Albany_STK3DPointStruct.cpp index 45f9cc1f79..af6d3d3f68 100644 --- a/src/disc/stk/Albany_STK3DPointStruct.cpp +++ b/src/disc/stk/Albany_STK3DPointStruct.cpp @@ -66,6 +66,8 @@ setBulkData (const Teuchos::RCP& comm) bulkData->declare_relation(pt, node, 0); bulkData->modification_end(); + + m_bulk_data_set = true; } void diff --git a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp index 87fa8ddce1..b7519a19b2 100644 --- a/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp +++ b/src/disc/stk/Albany_SideSetSTKMeshStruct.cpp @@ -204,6 +204,8 @@ setBulkData (const Teuchos::RCP& comm) // Loading the fields from file this->loadRequiredInputFields (comm); + + m_bulk_data_set = true; } Teuchos::RCP SideSetSTKMeshStruct::getValidDiscretizationParameters() const diff --git a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp index c46f239853..6ba8827e2d 100644 --- a/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp +++ b/src/disc/stk/Albany_TmplSTKMeshStruct_Def.hpp @@ -339,6 +339,8 @@ setBulkData (const Teuchos::RCP& comm) // Rebalance the mesh before starting the simulation if indicated rebalanceInitialMesh(comm); + + m_bulk_data_set = true; } template @@ -537,6 +539,8 @@ setBulkData(const Teuchos::RCP& comm) // STK fix_node_sharing(*bulkData); bulkData->modification_end(); + + m_bulk_data_set = true; } template<> From ecdb8025d245b3d495ff43199e8af9293861f99b Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Wed, 21 Feb 2024 12:48:55 -0700 Subject: [PATCH 11/12] Propagate discretization-related changes to CISM/MPAS interfaces --- .../Albany_CismSTKMeshStruct.cpp | 3 +- .../Albany_CismSTKMeshStruct.hpp | 26 ++------- src/landIce/interfaceWithCISM/ali_driver.cpp | 2 +- .../Albany_MpasSTKMeshStruct.cpp | 19 +------ .../Albany_MpasSTKMeshStruct.hpp | 14 +---- src/landIce/interfaceWithMPAS/Interface.cpp | 53 ++++++++++++------- 6 files changed, 45 insertions(+), 72 deletions(-) diff --git a/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp b/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp index 91f2daa81d..5b661328c2 100644 --- a/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp +++ b/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.cpp @@ -25,7 +25,6 @@ #include #endif -//#include #include #include @@ -332,7 +331,7 @@ constructMesh(const Teuchos::RCP& comm, const Teuchos::RCP& sis, const unsigned int worksetSize) { - this->SetupFieldData(comm, sis, worksetSize); + this->setFieldData(comm, sis); metaData->commit(); diff --git a/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.hpp b/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.hpp index c9cb98a34d..05441b669a 100644 --- a/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.hpp +++ b/src/landIce/interfaceWithCISM/Albany_CismSTKMeshStruct.hpp @@ -4,14 +4,11 @@ // in the file "license.txt" in the top-level Albany directory // //*****************************************************************// - #ifndef ALBANY_CISM_STKMESHSTRUCT_HPP #define ALBANY_CISM_STKMESHSTRUCT_HPP #include "Albany_GenericSTKMeshStruct.hpp" -//#include - namespace Albany { class CismSTKMeshStruct : public GenericSTKMeshStruct { @@ -57,20 +54,7 @@ namespace Albany { ~CismSTKMeshStruct() = default; - void setFieldData( - const Teuchos::RCP& /* comm */, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /* side_set_sis */ = {}) - { - // Nothing to do here - } - - void setBulkData( - const Teuchos::RCP& /* comm */, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /* side_set_sis */ = {}) + void setBulkData (const Teuchos::RCP& /* comm */) { // Nothing to do here } @@ -93,7 +77,6 @@ namespace Albany { void setRestartDataTime(double restartT) {restartTime = restartT; } private: - //Ioss::Init::Initializer ioInit; Teuchos::RCP getValidDiscretizationParameters() const; @@ -146,9 +129,8 @@ namespace Albany { int debug_output_verbosity; void resizeVec(std::vector > &vec , const unsigned int rows , const unsigned int columns); void resizeVec(std::vector > &vec , const unsigned int rows , const unsigned int columns); - - protected: }; -} -#endif +} // namespace Albany + +#endif // ALBANY_CISM_STKMESHSTRUCT_HPP diff --git a/src/landIce/interfaceWithCISM/ali_driver.cpp b/src/landIce/interfaceWithCISM/ali_driver.cpp index 08c233ac13..2ef4f39552 100644 --- a/src/landIce/interfaceWithCISM/ali_driver.cpp +++ b/src/landIce/interfaceWithCISM/ali_driver.cpp @@ -520,7 +520,7 @@ void ali_driver_init(int /* argc */, int /* exec_mode */, AliToGlimmer * ftg_ptr albanyApp->createMeshSpecs(meshStruct); albanyApp->buildProblem(); - meshStruct->constructMesh(reducedMpiCommT, discParams, albanyApp->getStateMgr().getStateInfoStruct(), meshStruct->getMeshSpecs()[0]->worksetSize); + meshStruct->constructMesh(reducedMpiCommT, discParams, albanyApp->getStateMgr().getStateInfoStruct(), meshStruct->meshSpecs[0]->worksetSize); //Create nodeVS //global_node_id_owned_map_Ptr is 1-based, so nodeVS is 1-based diff --git a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp index 283a2e97a2..5a6a6876db 100644 --- a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp +++ b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.cpp @@ -176,24 +176,10 @@ MpasSTKMeshStruct(const Teuchos::RCP& params, ebn, ebNameToIndex)); this->initializeSideSetMeshSpecs(comm); - this->initializeSideSetMeshStructs(comm); } -void MpasSTKMeshStruct::setFieldData( - const Teuchos::RCP& comm, - const Teuchos::RCP& sis, - const unsigned int worksetSize, - const std::map >& side_set_sis) -{ - this->SetupFieldData(comm, sis, worksetSize); - this->setSideSetFieldData(comm, side_set_sis, worksetSize); -} - -void MpasSTKMeshStruct::setBulkData( - const Teuchos::RCP& comm, - const Teuchos::RCP& /* sis */, - const unsigned int worksetSize, - const std::map >& side_set_sis) +void MpasSTKMeshStruct:: +setBulkData (const Teuchos::RCP& comm) { constexpr auto LAYER = LayeredMeshOrdering::LAYER; constexpr auto COLUMN = LayeredMeshOrdering::COLUMN; @@ -406,7 +392,6 @@ void MpasSTKMeshStruct::setBulkData( this->loadRequiredInputFields (comm); - this->setSideSetBulkData(comm, side_set_sis, worksetSize); } Teuchos::RCP diff --git a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp index b574064ab0..cb297e39b9 100644 --- a/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp +++ b/src/landIce/interfaceWithMPAS/Albany_MpasSTKMeshStruct.hpp @@ -18,7 +18,7 @@ class MpasSTKMeshStruct : public GenericSTKMeshStruct public: MpasSTKMeshStruct(const Teuchos::RCP& params, - const Teuchos::RCP& commT, + const Teuchos::RCP& comm, const std::vector& indexToVertexID, const std::vector& vertexProcIDs, const std::vector& verticesCoords, @@ -39,17 +39,7 @@ class MpasSTKMeshStruct : public GenericSTKMeshStruct ~MpasSTKMeshStruct( ) = default; - void setFieldData( - const Teuchos::RCP& /* comm */, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /* side_set_sis */ = {}); - - void setBulkData( - const Teuchos::RCP& /* comm */, - const Teuchos::RCP& /* sis */, - const unsigned int /* worksetSize */, - const std::map >& /* side_set_sis */ = {}); + void setBulkData (const Teuchos::RCP& comm); //! Flag if solution has a restart values -- used in Init Cond bool hasRestartSolution() const {return hasRestartSol; } diff --git a/src/landIce/interfaceWithMPAS/Interface.cpp b/src/landIce/interfaceWithMPAS/Interface.cpp index 8537d55fdd..7c2f0dde2b 100644 --- a/src/landIce/interfaceWithMPAS/Interface.cpp +++ b/src/landIce/interfaceWithMPAS/Interface.cpp @@ -21,26 +21,29 @@ #include "LandIce_ProblemFactory.hpp" #include "LandIce_StokesFO.hpp" +#include "Albany_SideSetSTKMeshStruct.hpp" #include "Albany_MpasSTKMeshStruct.hpp" -#include "Teuchos_ParameterList.hpp" -#include "Teuchos_RCP.hpp" #include "Albany_Utils.hpp" #include "Albany_SolverFactory.hpp" -#include "Teuchos_XMLParameterListHelpers.hpp" -#include "Teuchos_StandardCatchMacros.hpp" -#include -#include -#include "Piro_PerformSolve.hpp" -#include "Albany_OrdinarySTKFieldContainer.hpp" -#include "Albany_STKDiscretization.hpp" -#include "Thyra_DetachedVectorView.hpp" -#include "Teuchos_YamlParameterListHelpers.hpp" -#include "Teuchos_StackedTimer.hpp" -#include "Teuchos_TimeMonitor.hpp" #include "Albany_GlobalLocalIndexer.hpp" #include "Albany_StringUtils.hpp" // for 'upper_case' +#include "Albany_OrdinarySTKFieldContainer.hpp" +#include "Albany_STKDiscretization.hpp" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include #ifdef ALBANY_SEACAS #include @@ -159,9 +162,9 @@ void velocity_solver_solve_fo(int nLayers, int globalVerticesStride, const auto& basalFrictionParams = basalParams.sublist("Basal Friction Coefficient"); const auto betaType = util::upper_case(basalFrictionParams.get("Type")); - Teuchos::RCP ss_ms; - ss_ms = meshStruct->sideSetMeshStructs.at("basalside"); - betaField = ss_ms->metaData->get_field (stk::topology::NODE_RANK, "beta"); + auto ss_mesh = meshStruct->sideSetMeshStructs.at("basalside"); + auto ss_mesh_stk = Teuchos::rcp_dynamic_cast(ss_mesh,true); + betaField = ss_mesh_stk->metaData->get_field (stk::topology::NODE_RANK, "beta"); for (int j = 0; j < numVertices3D; ++j) { int ib = (ordering == 0) * (j % lVertexColumnShift) @@ -384,9 +387,9 @@ void velocity_solver_solve_fo(int nLayers, int globalVerticesStride, } } - if (Teuchos::nonnull(ss_ms) && !betaData.empty() && (betaField!=nullptr)) { + if (Teuchos::nonnull(ss_mesh_stk) && !betaData.empty() && (betaField!=nullptr)) { for(int ib = 0; ib < (int) indexToVertexID.size(); ++ib) { - stk::mesh::Entity node = ss_ms->bulkData->get_entity(stk::topology::NODE_RANK, indexToVertexID[ib]); + stk::mesh::Entity node = ss_mesh_stk->bulkData->get_entity(stk::topology::NODE_RANK, indexToVertexID[ib]); const double* betaVal = stk::mesh::field_data(*betaField,node); betaData[ib] = betaVal[0]; } @@ -812,6 +815,20 @@ void velocity_solver_extrude_3d_grid(int nLayers, int globalTrianglesStride, nLayers, num_params, Ordering)); } + // Create side meshes + for (const auto& ss : ss_pl.get>("Side Sets")) { + const auto ms = meshStruct->meshSpecs[0]; + auto params_ss = Teuchos::rcpFromRef(ss_pl.sublist(ss)); + params_ss->set("Number Of Time Derivatives",discretizationList->get("Number Of Time Derivatives")); + + auto ss_mesh = Teuchos::rcp(new Albany::SideSetSTKMeshStruct(*ms, params_ss, mpiComm, num_params)); + + ss_mesh->setParentMeshInfo(*meshStruct, ss); + + meshStruct->sideSetMeshStructs[ss] = ss_mesh; + } + meshStruct->createSideMeshMaps(); + albanyApp->createMeshSpecs(meshStruct); albanyApp->buildProblem(); From d5367bb47c15b6b4a068c5bc04d1376cbd6a4f7a Mon Sep 17 00:00:00 2001 From: Luca Bertagna Date: Thu, 22 Feb 2024 11:16:50 -0700 Subject: [PATCH 12/12] fixup! Misc cleanups and nano-fixes --- src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp index ef7cb58cef..1043cb711a 100644 --- a/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp +++ b/src/disc/stk/Albany_OrdinarySTKFieldContainer.cpp @@ -261,7 +261,7 @@ saveSolnVector (const Thyra_Vector& soln, const dof_mgr_ptr_t& sol_dof_mgr, const bool overlapped) { - if (save_solution_field) { + if (save_solution_field) { saveVectorImpl (soln, solution_field[0]->name(), sol_dof_mgr, overlapped); }