diff --git a/.gitignore b/.gitignore index d87be6b9c28c..bb99cfc3741f 100644 --- a/.gitignore +++ b/.gitignore @@ -229,6 +229,7 @@ framework/contrib/asio/ *.cpr *.cpa.gz-* *.cpr-* +*_cp/ # Ignore petsc arch petsc/arch-*/* diff --git a/framework/include/constraints/NodeElemConstraintBase.h b/framework/include/constraints/NodeElemConstraintBase.h index 21b2e3c279ff..ba076170e851 100644 --- a/framework/include/constraints/NodeElemConstraintBase.h +++ b/framework/include/constraints/NodeElemConstraintBase.h @@ -100,7 +100,7 @@ class NodeElemConstraintBase const VariableTestValue & _test_primary; /// MooseMesh map of current nodes to the connected elements - const std::map> & _node_to_elem_map; + const std::unordered_map> & _node_to_elem_map; /// maps secondary node ids to primary element ids std::map _secondary_to_primary_map; diff --git a/framework/include/constraints/NodeFaceConstraint.h b/framework/include/constraints/NodeFaceConstraint.h index ce605a2006c2..8a48bd491990 100644 --- a/framework/include/constraints/NodeFaceConstraint.h +++ b/framework/include/constraints/NodeFaceConstraint.h @@ -298,7 +298,7 @@ class NodeFaceConstraint : public Constraint, /// DOF map const DofMap & _dof_map; - const std::map> & _node_to_elem_map; + const std::unordered_map> & _node_to_elem_map; /** * Whether or not the secondary's residual should be overwritten. diff --git a/framework/include/geomsearch/PenetrationThread.h b/framework/include/geomsearch/PenetrationThread.h index 7df368a6d793..4f6142c38c5a 100644 --- a/framework/include/geomsearch/PenetrationThread.h +++ b/framework/include/geomsearch/PenetrationThread.h @@ -24,22 +24,23 @@ typedef MooseVariableFE> VectorMooseVariable; class PenetrationThread { public: - PenetrationThread(SubProblem & subproblem, - const MooseMesh & mesh, - BoundaryID primary_boundary, - BoundaryID secondary_boundary, - std::map & penetration_info, - bool check_whether_reasonable, - bool update_location, - Real tangential_tolerance, - bool do_normal_smoothing, - Real normal_smoothing_distance, - PenetrationLocator::NORMAL_SMOOTHING_METHOD normal_smoothing_method, - bool use_point_locator, - std::vector> & fes, - libMesh::FEType & fe_type, - NearestNodeLocator & nearest_node, - const std::map> & node_to_elem_map); + PenetrationThread( + SubProblem & subproblem, + const MooseMesh & mesh, + BoundaryID primary_boundary, + BoundaryID secondary_boundary, + std::map & penetration_info, + bool check_whether_reasonable, + bool update_location, + Real tangential_tolerance, + bool do_normal_smoothing, + Real normal_smoothing_distance, + PenetrationLocator::NORMAL_SMOOTHING_METHOD normal_smoothing_method, + bool use_point_locator, + std::vector> & fes, + libMesh::FEType & fe_type, + NearestNodeLocator & nearest_node, + const std::unordered_map> & node_to_elem_map); // Splitting Constructor PenetrationThread(PenetrationThread & x, Threads::split split); @@ -78,7 +79,7 @@ class PenetrationThread NearestNodeLocator & _nearest_node; - const std::map> & _node_to_elem_map; + const std::unordered_map> & _node_to_elem_map; THREAD_ID _tid; diff --git a/framework/include/geomsearch/SecondaryNeighborhoodThread.h b/framework/include/geomsearch/SecondaryNeighborhoodThread.h index e522a8f1865e..d71fbdb06ae8 100644 --- a/framework/include/geomsearch/SecondaryNeighborhoodThread.h +++ b/framework/include/geomsearch/SecondaryNeighborhoodThread.h @@ -27,7 +27,7 @@ class SecondaryNeighborhoodThread SecondaryNeighborhoodThread( const MooseMesh & mesh, const std::vector & trial_primary_nodes, - const std::map> & node_to_elem_map, + const std::unordered_map> & node_to_elem_map, const unsigned int patch_size, KDTree & _kd_tree); @@ -55,7 +55,7 @@ class SecondaryNeighborhoodThread const std::vector & _trial_primary_nodes; /// Node to elem map - const std::map> & _node_to_elem_map; + const std::unordered_map> & _node_to_elem_map; /// The number of nodes to keep unsigned int _patch_size; diff --git a/framework/include/loops/BoundaryNodeIntegrityCheckThread.h b/framework/include/loops/BoundaryNodeIntegrityCheckThread.h index 4f587cb936b0..7c9ec5a10b87 100644 --- a/framework/include/loops/BoundaryNodeIntegrityCheckThread.h +++ b/framework/include/loops/BoundaryNodeIntegrityCheckThread.h @@ -52,5 +52,5 @@ class BoundaryNodeIntegrityCheckThread const TheWarehouse::Query & _query; /// Node to element map. Used for determining vertex vs. non-vertex nodes - const std::map> _node_to_elem_map; + const std::unordered_map> _node_to_elem_map; }; diff --git a/framework/include/mesh/MooseMesh.h b/framework/include/mesh/MooseMesh.h index 944fc50e0d48..2323d817aef1 100644 --- a/framework/include/mesh/MooseMesh.h +++ b/framework/include/mesh/MooseMesh.h @@ -251,16 +251,7 @@ class MooseMesh : public MooseObject, public Restartable, public PerfGraphInterf * If not already created, creates a map from every node to all * elements to which they are connected. */ - const std::map> & nodeToElemMap(); - - /** - * If not already created, creates a map from every node to all - * _active_ _semilocal_ elements to which they are connected. - * Semilocal elements include local elements and elements that share at least - * one node with a local element. - * \note Extra ghosted elements are not included in this map! - */ - const std::map> & nodeToActiveSemilocalElemMap(); + const std::unordered_map> & nodeToElemMap(); /** * These structs are required so that the bndNodes{Begin,End} and @@ -1655,12 +1646,10 @@ class MooseMesh : public MooseObject, public Restartable, public PerfGraphInterf _bnd_elem_range; /// A map of all of the current nodes to the elements that they are connected to. - std::map> _node_to_elem_map; - bool _node_to_elem_map_built; + std::unordered_map> _node_to_elem_map; - /// A map of all of the current nodes to the active elements that they are connected to. - std::map> _node_to_active_semilocal_elem_map; - bool _node_to_active_semilocal_elem_map_built; + /// Whether @p _node_to_elem_map has been built. + bool _node_to_elem_map_built = false; /** * A set of subdomain IDs currently present in the mesh. For parallel meshes, includes @@ -1744,6 +1733,12 @@ class MooseMesh : public MooseObject, public Restartable, public PerfGraphInterf void setPartitionerHelper(MeshBase * mesh = nullptr); private: + /** + * If not already created, creates a map from every node to all + * elements to which they are connected. + */ + std::unordered_map> & internalNodeToElemMap(); + /// Map connecting elems with their corresponding ElemInfo, we use the element ID as /// the key mutable std::unordered_map _elem_to_elem_info; diff --git a/framework/src/auxkernels/NodalPatchRecovery.C b/framework/src/auxkernels/NodalPatchRecovery.C index fd1142d2a1c2..629eed0cd159 100644 --- a/framework/src/auxkernels/NodalPatchRecovery.C +++ b/framework/src/auxkernels/NodalPatchRecovery.C @@ -173,7 +173,7 @@ NodalPatchRecovery::compute() reinitPatch(); // get node-to-conneted-elem map - const std::map> & node_to_elem_map = _mesh.nodeToElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); auto node_to_elem_pair = node_to_elem_map.find(_current_node->id()); mooseAssert(node_to_elem_pair != node_to_elem_map.end(), "Missing entry in node to elem map"); std::vector elem_ids = node_to_elem_pair->second; diff --git a/framework/src/geomsearch/NearestNodeLocator.C b/framework/src/geomsearch/NearestNodeLocator.C index 8541084b7c59..a1551fe92c68 100644 --- a/framework/src/geomsearch/NearestNodeLocator.C +++ b/framework/src/geomsearch/NearestNodeLocator.C @@ -55,9 +55,6 @@ NearestNodeLocator::NearestNodeLocator(SubProblem & subproblem, mooseError("NearestNodeLocator being created for boundaries ", _boundary1, " and ", _boundary2, ", but boundary ", _boundary2, " does not exist"); */ - - // Request the nodeToElem map upfront - _mesh.nodeToElemMap(); } NearestNodeLocator::~NearestNodeLocator() = default; @@ -71,7 +68,7 @@ NearestNodeLocator::findNodes() * If this is the first time through we're going to build up a "neighborhood" of nodes * surrounding each of the secondary nodes. This will speed searching later. */ - const std::map> & node_to_elem_map = _mesh.nodeToElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); if (_first || (_reinit_iteration && _patch_update_strategy == Moose::Iteration)) { @@ -294,7 +291,7 @@ NearestNodeLocator::updatePatch(std::vector & secondary_nodes) primary_points[i] = node; } - const std::map> & node_to_elem_map = _mesh.nodeToElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); // Create object kd_tree of class KDTree using the coordinates of trial // primary nodes. diff --git a/framework/src/geomsearch/PenetrationLocator.C b/framework/src/geomsearch/PenetrationLocator.C index 90a308c76a44..4c517be7bd7e 100644 --- a/framework/src/geomsearch/PenetrationLocator.C +++ b/framework/src/geomsearch/PenetrationLocator.C @@ -87,9 +87,6 @@ PenetrationLocator::PenetrationLocator(SubProblem & subproblem, "nodal_normal_z variables must exist. Are you missing the \\[NodalNormals\\] block?"); } } - - // Request the nodeToElem map upfront - _mesh.nodeToElemMap(); } PenetrationLocator::~PenetrationLocator() diff --git a/framework/src/geomsearch/PenetrationThread.C b/framework/src/geomsearch/PenetrationThread.C index 187f1d0ce470..c698c72f18e4 100644 --- a/framework/src/geomsearch/PenetrationThread.C +++ b/framework/src/geomsearch/PenetrationThread.C @@ -111,7 +111,7 @@ PenetrationThread::PenetrationThread( std::vector> & fes, FEType & fe_type, NearestNodeLocator & nearest_node, - const std::map> & node_to_elem_map) + const std::unordered_map> & node_to_elem_map) : _subproblem(subproblem), _mesh(mesh), _primary_boundary(primary_boundary), diff --git a/framework/src/geomsearch/SecondaryNeighborhoodThread.C b/framework/src/geomsearch/SecondaryNeighborhoodThread.C index 71b9a7d39d8a..1abe6b016d83 100644 --- a/framework/src/geomsearch/SecondaryNeighborhoodThread.C +++ b/framework/src/geomsearch/SecondaryNeighborhoodThread.C @@ -19,7 +19,7 @@ SecondaryNeighborhoodThread::SecondaryNeighborhoodThread( const MooseMesh & mesh, const std::vector & trial_primary_nodes, - const std::map> & node_to_elem_map, + const std::unordered_map> & node_to_elem_map, const unsigned int patch_size, KDTree & kd_tree) : _kd_tree(kd_tree), diff --git a/framework/src/loops/BoundaryNodeIntegrityCheckThread.C b/framework/src/loops/BoundaryNodeIntegrityCheckThread.C index 58523def0032..1113b467509a 100644 --- a/framework/src/loops/BoundaryNodeIntegrityCheckThread.C +++ b/framework/src/loops/BoundaryNodeIntegrityCheckThread.C @@ -31,7 +31,7 @@ BoundaryNodeIntegrityCheckThread::BoundaryNodeIntegrityCheckThread( _nodal_vec_aux(_aux_sys.nodalVectorAuxWarehouse()), _nodal_array_aux(_aux_sys.nodalArrayAuxWarehouse()), _query(query), - _node_to_elem_map(fe_problem.mesh().nodeToActiveSemilocalElemMap()) + _node_to_elem_map(fe_problem.mesh().nodeToElemMap()) { } diff --git a/framework/src/mesh/MooseMesh.C b/framework/src/mesh/MooseMesh.C index c3d4140ac89d..b0a45dd207ac 100644 --- a/framework/src/mesh/MooseMesh.C +++ b/framework/src/mesh/MooseMesh.C @@ -240,8 +240,6 @@ MooseMesh::MooseMesh(const InputParameters & parameters) _skip_refine_when_use_split(getParam("skip_refine_when_use_split")), _skip_deletion_repartition_after_refine(false), _is_nemesis(false), - _node_to_elem_map_built(false), - _node_to_active_semilocal_elem_map_built(false), _patch_size(getParam("patch_size")), _ghosting_patch_size(isParamValid("ghosting_patch_size") ? getParam("ghosting_patch_size") @@ -309,8 +307,6 @@ MooseMesh::MooseMesh(const MooseMesh & other_mesh) _skip_refine_when_use_split(other_mesh._skip_refine_when_use_split), _skip_deletion_repartition_after_refine(other_mesh._skip_deletion_repartition_after_refine), _is_nemesis(other_mesh._is_nemesis), - _node_to_elem_map_built(false), - _node_to_active_semilocal_elem_map_built(false), _patch_size(other_mesh._patch_size), _ghosting_patch_size(other_mesh._ghosting_patch_size), _max_leaf_size(other_mesh._max_leaf_size), @@ -633,9 +629,13 @@ MooseMesh::update() // Rebuild the boundary conditions buildNodeListFromSideList(); - // Clear the node to elem maps + // Capture whether the map needs rebuilding, then invalidate the stale data. + // We use clear() rather than destroying the container so that any stored references + // to _node_to_elem_map (e.g. in NodeFaceConstraint) remain valid through the window + // between the clear and the rebuild at the end of this function. + const bool rebuild_node_to_elem_map = _node_to_elem_map_built; _node_to_elem_map.clear(); - _node_to_active_semilocal_elem_map.clear(); + _node_to_elem_map_built = false; buildNodeList(); buildBndElemList(); @@ -669,19 +669,10 @@ MooseMesh::update() _finite_volume_info_dirty = true; - // Rebuild the node to elem maps, in case the object(s) who got references to the maps - // actually do need to use them - if (_node_to_elem_map_built) - { - // it won't stay false - _node_to_elem_map_built = false; + // Rebuild the node to elem map, in case the object(s) who got references to the map + // actually do need to use it + if (rebuild_node_to_elem_map) nodeToElemMap(); - } - if (_node_to_active_semilocal_elem_map_built) - { - _node_to_active_semilocal_elem_map_built = false; - nodeToActiveSemilocalElemMap(); - } } void @@ -1227,8 +1218,8 @@ MooseMesh::buildBndElemList() } } -const std::map> & -MooseMesh::nodeToElemMap() +std::unordered_map> & +MooseMesh::internalNodeToElemMap() { if (!_node_to_elem_map_built) // Guard the creation with a double checked lock { @@ -1245,6 +1236,7 @@ MooseMesh::nodeToElemMap() TIME_SECTION("nodeToElemMap", 5, "Building Node To Elem Map"); Threads::in_threads = in_threads; + mooseAssert(_node_to_elem_map.empty(), "Expected empty map before building"); for (const auto & elem : getMesh().active_element_ptr_range()) for (unsigned int n = 0; n < elem->n_nodes(); n++) _node_to_elem_map[elem->node_id(n)].push_back(elem->id()); @@ -1255,36 +1247,10 @@ MooseMesh::nodeToElemMap() return _node_to_elem_map; } -const std::map> & -MooseMesh::nodeToActiveSemilocalElemMap() +const std::unordered_map> & +MooseMesh::nodeToElemMap() { - if (!_node_to_active_semilocal_elem_map_built) // Guard the creation with a double checked lock - { - Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); - - // This is allowing the timing to be run even with threads - // This is safe because all threads will be waiting on this section when it runs - // NOTE: Do not copy this construction to other places without thinking REALLY hard about it - // The PerfGraph is NOT threadsafe and will cause all kinds of havok if care isn't taken - auto in_threads = Threads::in_threads; - Threads::in_threads = false; - TIME_SECTION("nodeToActiveSemilocalElemMap", 5, "Building SemiLocalElemMap"); - Threads::in_threads = in_threads; - - if (!_node_to_active_semilocal_elem_map_built) - { - for (const auto & elem : - as_range(getMesh().semilocal_elements_begin(), getMesh().semilocal_elements_end())) - if (elem->active()) - for (unsigned int n = 0; n < elem->n_nodes(); n++) - _node_to_active_semilocal_elem_map[elem->node_id(n)].push_back(elem->id()); - - _node_to_active_semilocal_elem_map_built = - true; // MUST be set at the end for double-checked locking to work! - } - } - - return _node_to_active_semilocal_elem_map; + return internalNodeToElemMap(); } ConstElemRange * @@ -1687,13 +1653,7 @@ MooseMesh::addQuadratureNode(const Elem * elem, _elem_to_side_to_qp_to_quadrature_nodes[elem->id()][side][qp] = qnode; if (elem->active()) - { - // If they have not been built, no need to start building an incomplete one - if (_node_to_elem_map_built) - _node_to_elem_map[new_id].push_back(elem->id()); - if (_node_to_active_semilocal_elem_map_built) - _node_to_active_semilocal_elem_map[new_id].push_back(elem->id()); - } + internalNodeToElemMap()[new_id].push_back(elem->id()); } else qnode = _elem_to_side_to_qp_to_quadrature_nodes[elem->id()][side][qp]; diff --git a/framework/src/problems/FEProblemBase.C b/framework/src/problems/FEProblemBase.C index 628535a9c9ea..04e93b986695 100644 --- a/framework/src/problems/FEProblemBase.C +++ b/framework/src/problems/FEProblemBase.C @@ -1415,7 +1415,7 @@ FEProblemBase::initialSetup() Threads::parallel_reduce(bnd_nodes, bnict); // Nodal bcs aren't threaded - const auto & node_to_elem_map = _mesh.nodeToActiveSemilocalElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); for (const auto & bnode : bnd_nodes) { const auto boundary_id = bnode->_bnd_id; diff --git a/modules/phase_field/src/postprocessors/FeatureFloodCount.C b/modules/phase_field/src/postprocessors/FeatureFloodCount.C index cb5c1afd2c4a..39a230dd4441 100644 --- a/modules/phase_field/src/postprocessors/FeatureFloodCount.C +++ b/modules/phase_field/src/postprocessors/FeatureFloodCount.C @@ -1497,7 +1497,7 @@ FeatureFloodCount::isNewFeatureOrConnectedRegion(const DofObject * dof_object, void FeatureFloodCount::expandPointHalos() { - const auto & node_to_elem_map = _mesh.nodeToActiveSemilocalElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); FeatureData::container_type expanded_local_ids; auto my_processor_id = processor_id(); diff --git a/modules/phase_field/src/userobjects/EBSDReader.C b/modules/phase_field/src/userobjects/EBSDReader.C index 0b08021cc285..ef9c81a04f07 100644 --- a/modules/phase_field/src/userobjects/EBSDReader.C +++ b/modules/phase_field/src/userobjects/EBSDReader.C @@ -468,8 +468,7 @@ EBSDReader::buildNodeWeightMaps() // Import nodeToElemMap from MooseMesh for current node // This map consists of the node index followed by a vector of element indices that are associated // with that node - const std::map> & node_to_elem_map = - _mesh.nodeToActiveSemilocalElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); libMesh::MeshBase & mesh = _mesh.getMesh(); // Loop through each node in mesh and calculate eta values for each grain associated with the node diff --git a/modules/solid_mechanics/src/userobjects/CrackFrontDefinition.C b/modules/solid_mechanics/src/userobjects/CrackFrontDefinition.C index 3471eb8ba7f7..0159324e3c1e 100644 --- a/modules/solid_mechanics/src/userobjects/CrackFrontDefinition.C +++ b/modules/solid_mechanics/src/userobjects/CrackFrontDefinition.C @@ -488,8 +488,7 @@ CrackFrontDefinition::orderCrackFrontNodes(std::set & nodes) // set_intersection. // The original map contains vectors, and we can't sort them, so we create sets in the local // map. - const std::map> & node_to_elem_map = - _mesh.nodeToElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); std::map> crack_front_node_to_elem_map; for (const auto & node_id : nodes) diff --git a/modules/thermal_hydraulics/src/components/Component1DJunction.C b/modules/thermal_hydraulics/src/components/Component1DJunction.C index 966e88cb1f70..ceff6491bef8 100644 --- a/modules/thermal_hydraulics/src/components/Component1DJunction.C +++ b/modules/thermal_hydraulics/src/components/Component1DJunction.C @@ -54,7 +54,7 @@ Component1DJunction::setupMesh() // name the sideset corresponding to the sides of all connected component ends boundary_info.sideset_name(boundary_id) = name(); - const std::map> & node_to_elem = mesh().nodeToElemMap(); + const auto & node_to_elem = mesh().nodeToElemMap(); for (auto & nid : _nodes) { const auto & it = node_to_elem.find(nid); diff --git a/python/TestHarness/tests/resultsstore/content/cached_testharness_results.json b/python/TestHarness/tests/resultsstore/content/cached_testharness_results.json index 0f555f17eab5..7280eb4f271b 100644 --- a/python/TestHarness/tests/resultsstore/content/cached_testharness_results.json +++ b/python/TestHarness/tests/resultsstore/content/cached_testharness_results.json @@ -17,7 +17,8 @@ "user": "harblh" }, "apptainer": { - "path": "/hpc-common/moose/containers/moose-dev-mpich/2025.10.27_24e4ea0512807c13a6da2d7399e7d355d05afe34240c80a8133ec9e060811f3d/moose-dev-mpich-x86_64_2025.10.27.sif", + "path": + "/hpc-common/moose/containers/moose-dev-mpich/2025.10.27_24e4ea0512807c13a6da2d7399e7d355d05afe34240c80a8133ec9e060811f3d/moose-dev-mpich-x86_64_2025.10.27.sif", "generator_library": "moose-dev", "generator_name": "moose-dev-mpich-x86_64", "generator_tag": "2025.10.27", @@ -135,7 +136,8 @@ }, "tester": { "name": "CSVDiff", - "command": "/tmp/tmptgy_j23g/moose_test-opt -i validation.i --disable-perf-graph-live Outputs/perf_graph_json_file=/tmp/tmptgy_j23g/validation/metadata_perf_graph_test.json --compute-device=cpu", + "command": + "/tmp/tmptgy_j23g/moose_test-opt -i validation.i --disable-perf-graph-live Outputs/perf_graph_json_file=/tmp/tmptgy_j23g/validation/metadata_perf_graph_test.json --compute-device=cpu", "input_file": "/tmp/tmptgy_j23g/validation/validation.i", "json_metadata": { "perf_graph": { @@ -183,12 +185,6 @@ "time": 6.981e-06 }, "FEProblem::BoundaryRestrictedNodeIntegrityCheck": { - "MeshGeneratorMesh::nodeToActiveSemilocalElemMap": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 1.4462e-05 - }, "level": 5, "memory": 0, "num_calls": 1, @@ -433,24 +429,26 @@ }, "MooseApp::setup": { "MooseApp::runInputFile": { - "Action::AddDefaultConvergenceAction::auto_adddefaultconvergenceaction::act": { - "level": 4, - "memory": 0, - "num_calls": 3, - "time": 0.00078296 - }, + "Action::AddDefaultConvergenceAction::auto_adddefaultconvergenceaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 3, + "time": 0.00078296 + }, "Action::AddExecutorAction::auto_addexecutoraction::act": { "level": 4, "memory": 0, "num_calls": 1, "time": 1.192e-06 }, - "Action::AddExternalAuxVariableAction::auto_addexternalauxvariableaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 4.81e-07 - }, + "Action::AddExternalAuxVariableAction::auto_addexternalauxvariableaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 4.81e-07 + }, "Action::AddMeshGeneratorAction::gmg::act": { "level": 4, "memory": 0, @@ -487,30 +485,33 @@ "num_calls": 1, "time": 0.000353062 }, - "Action::AddRelationshipManager::auto_addrelationshipmanager::act": { - "level": 4, - "memory": 0, - "num_calls": 7, - "time": 8.302e-06 - }, - "Action::AddTaggedMatricesAction::auto_addtaggedmatricesaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 3.686e-06 - }, + "Action::AddRelationshipManager::auto_addrelationshipmanager::act": + { + "level": 4, + "memory": 0, + "num_calls": 7, + "time": 8.302e-06 + }, + "Action::AddTaggedMatricesAction::auto_addtaggedmatricesaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 3.686e-06 + }, "Action::AutoCheckpointAction::Outputs::act": { "level": 4, "memory": 0, "num_calls": 1, "time": 0.000452452 }, - "Action::ChainControlSetupAction::auto_chaincontrolsetupaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 2.243e-06 - }, + "Action::ChainControlSetupAction::auto_chaincontrolsetupaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 2.243e-06 + }, "Action::CheckIntegrityAction::auto_checkintegrityaction::act": { "FEProblem::checkProblemIntegrity": { "level": 5, @@ -535,30 +536,33 @@ "num_calls": 3, "time": 0.001522346 }, - "Action::ComposeTimeStepperAction::auto_composetimestepperaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 1.6044e-05 - }, + "Action::ComposeTimeStepperAction::auto_composetimestepperaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 1.6044e-05 + }, "Action::CopyNodalVarsAction::auto_copynodalvarsaction::act": { "level": 4, "memory": 0, "num_calls": 3, "time": 3.535e-06 }, - "Action::CouplingFunctorCheckAction::auto_couplingfunctorcheckaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 1.8e-07 - }, - "Action::CreateAddedMeshGenerators::auto_createaddedmeshgenerators::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 0.000382157 - }, + "Action::CouplingFunctorCheckAction::auto_couplingfunctorcheckaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 1.8e-07 + }, + "Action::CreateAddedMeshGenerators::auto_createaddedmeshgenerators::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 0.000382157 + }, "Action::CreateDisplacedProblemAction::Mesh::act": { "level": 4, "memory": 0, @@ -577,24 +581,26 @@ "num_calls": 1, "time": 1.572e-06 }, - "Action::CreateProblemDefaultAction::auto_createproblemdefaultaction::act": { - "FEProblem::initNullSpaceVectors": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 5.598e-06 - }, - "level": 4, - "memory": 7, - "num_calls": 2, - "time": 0.001690068 - }, - "Action::DeclareLateReportersAction::auto_declarelatereportersaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 4.6e-07 - }, + "Action::CreateProblemDefaultAction::auto_createproblemdefaultaction::act": + { + "FEProblem::initNullSpaceVectors": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 5.598e-06 + }, + "level": 4, + "memory": 7, + "num_calls": 2, + "time": 0.001690068 + }, + "Action::DeclareLateReportersAction::auto_declarelatereportersaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 4.6e-07 + }, "Action::DisplayGhostingAction::Mesh::act": { "level": 4, "memory": 0, @@ -619,18 +625,19 @@ "num_calls": 3, "time": 4.01e-07 }, - "Action::ExecuteMeshGenerators::auto_executemeshgenerators::act": { - "MeshGeneratorSystem::createMeshGeneratorOrder": { - "level": 1, - "memory": 0, - "num_calls": 1, - "time": 1.8959e-05 - }, - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 0.00035163 - }, + "Action::ExecuteMeshGenerators::auto_executemeshgenerators::act": + { + "MeshGeneratorSystem::createMeshGeneratorOrder": { + "level": 1, + "memory": 0, + "num_calls": 1, + "time": 1.8959e-05 + }, + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 0.00035163 + }, "Action::InitProblemAction::auto_initproblemaction::act": { "FEProblem::init": { "FEProblem::EquationSystems::Init": { @@ -733,12 +740,13 @@ "num_calls": 2, "time": 0.000247303 }, - "Action::ResolveOptionalMaterialPropertiesAction::auto_resolveoptionalmaterialpropertiesaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 7.91e-07 - }, + "Action::ResolveOptionalMaterialPropertiesAction::auto_resolveoptionalmaterialpropertiesaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 7.91e-07 + }, "Action::SetupDampersAction::auto_setupdampersaction::act": { "level": 4, "memory": 0, @@ -746,78 +754,81 @@ "time": 4.61e-07 }, "Action::SetupMeshAction::Mesh::act": { - "Action::SetupMeshAction::Mesh::SetupMeshAction::act::set_mesh_base": { - "MeshGeneratorMesh::init": { - "level": 2, - "memory": 0, - "num_calls": 1, - "time": 1.6876e-05 - }, - "level": 1, - "memory": 0, - "num_calls": 2, - "time": 6.9534e-05 - }, - "Action::SetupMeshAction::Mesh::SetupMeshAction::act::setup_mesh": { - "level": 1, - "memory": 0, - "num_calls": 1, - "time": 0.00045126 - }, + "Action::SetupMeshAction::Mesh::SetupMeshAction::act::set_mesh_base": + { + "MeshGeneratorMesh::init": { + "level": 2, + "memory": 0, + "num_calls": 1, + "time": 1.6876e-05 + }, + "level": 1, + "memory": 0, + "num_calls": 2, + "time": 6.9534e-05 + }, + "Action::SetupMeshAction::Mesh::SetupMeshAction::act::setup_mesh": + { + "level": 1, + "memory": 0, + "num_calls": 1, + "time": 0.00045126 + }, "level": 4, "memory": 0, "num_calls": 3, "time": 0.0001521 }, "Action::SetupMeshCompleteAction::Mesh::act": { - "Action::SetupMeshCompleteAction::Mesh::completeSetupUndisplaced": { - "MeshGeneratorMesh::prepare": { - "MeshGeneratorMesh::detectOrthogonalDimRanges": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 9.725e-06 - }, - "MeshGeneratorMesh::setCoordSystem": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 4.5279e-05 - }, - "MeshGeneratorMesh::update": { - "MeshGeneratorMesh::buildBndElemList": { - "level": 5, + "Action::SetupMeshCompleteAction::Mesh::completeSetupUndisplaced": + { + "MeshGeneratorMesh::prepare": { + "MeshGeneratorMesh::detectOrthogonalDimRanges": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 9.725e-06 + }, + "MeshGeneratorMesh::setCoordSystem": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 4.5279e-05 + }, + "MeshGeneratorMesh::update": { + "MeshGeneratorMesh::buildBndElemList": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 1.345e-05 + }, + "MeshGeneratorMesh::buildNodeList": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 8.442e-06 + }, + "MeshGeneratorMesh::cacheInfo": { + "level": 3, + "memory": 0, + "num_calls": 1, + "time": 2.8964e-05 + }, + "level": 3, + "memory": 0, + "num_calls": 1, + "time": 0.000142776 + }, + "level": 2, "memory": 0, - "num_calls": 1, - "time": 1.345e-05 + "num_calls": 2, + "time": 0.000192568 }, - "MeshGeneratorMesh::buildNodeList": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 8.442e-06 - }, - "MeshGeneratorMesh::cacheInfo": { - "level": 3, - "memory": 0, - "num_calls": 1, - "time": 2.8964e-05 - }, - "level": 3, + "level": 2, "memory": 0, - "num_calls": 1, - "time": 0.000142776 + "num_calls": 2, + "time": 7.908e-05 }, - "level": 2, - "memory": 0, - "num_calls": 2, - "time": 0.000192568 - }, - "level": 2, - "memory": 0, - "num_calls": 2, - "time": 7.908e-05 - }, "Action::SetupMeshCompleteAction::Mesh::deleteRemoteElems": { "level": 2, "memory": 0, @@ -835,36 +846,40 @@ "num_calls": 4, "time": 0.000158331 }, - "Action::SetupQuadratureAction::auto_setupquadratureaction::act": { - "MeshGeneratorMesh::getActiveLocalElementRange": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 8.714e-06 - }, - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 9.972e-05 - }, - "Action::SetupRecoverFileBaseAction::auto_setuprecoverfilebaseaction::act": { - "level": 4, - "memory": 0, - "num_calls": 2, - "time": 2.674e-06 - }, - "Action::SetupTimeStepperAction::auto_setuptimestepperaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 3.61e-07 - }, - "Action::StartWebServerControlAction::auto_startwebservercontrolaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 1.3e-07 - }, + "Action::SetupQuadratureAction::auto_setupquadratureaction::act": + { + "MeshGeneratorMesh::getActiveLocalElementRange": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 8.714e-06 + }, + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 9.972e-05 + }, + "Action::SetupRecoverFileBaseAction::auto_setuprecoverfilebaseaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 2, + "time": 2.674e-06 + }, + "Action::SetupTimeStepperAction::auto_setuptimestepperaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 3.61e-07 + }, + "Action::StartWebServerControlAction::auto_startwebservercontrolaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 1.3e-07 + }, "level": 3, "memory": 0, "num_calls": 1, @@ -911,10 +926,13 @@ "/tmp/tmptgy_j23g/validation/validation_out.csv" ], "output": { - "runner_run": "Framework Information:\nMOOSE Version: git commit e760fe182e3 on 2025-11-03\nLibMesh Version: 910736a3a20aded528c3ba99371ce65980dc8e2c\nPETSc Version: 3.24.0\nSLEPc Version: 3.24.0\nCurrent Time: Tue Nov 11 13:43:54 2025\nExecutable Timestamp: Mon Nov 3 17:43:48 2025\n\nInput File(s):\n /tmp/tmptgy_j23g/validation/validation.i\n\nCommand Line Argument(s):\n --disable-perf-graph-live\n --compute-device=cpu\n\nCommand Line Input Argument(s):\n Outputs/perf_graph_json_file=/tmp/tmptgy_j23g/validation/metadata_perf_graph_test.json\n\nCheckpoint:\n Wall Time Interval: Every 3600 s\n User Checkpoint: Disabled\n # Checkpoints Kept: 2\n Execute On: TIMESTEP_END \n\nParallelism:\n Num Processors: 1\n Num Threads: 1\n\nMesh: \n Parallel Type: replicated\n Mesh Dimension: 1\n Spatial Dimension: 1\n Nodes: 2\n Elems: 1\n Num Subdomains: 1\n\nExecution Information:\n Executioner: Steady\n Solver Mode: Preconditioned JFNK \n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n\u001b[32m Solve Skipped!\u001b[39m\n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n| 1.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n", + "runner_run": + "Framework Information:\nMOOSE Version: git commit e760fe182e3 on 2025-11-03\nLibMesh Version: 910736a3a20aded528c3ba99371ce65980dc8e2c\nPETSc Version: 3.24.0\nSLEPc Version: 3.24.0\nCurrent Time: Tue Nov 11 13:43:54 2025\nExecutable Timestamp: Mon Nov 3 17:43:48 2025\n\nInput File(s):\n /tmp/tmptgy_j23g/validation/validation.i\n\nCommand Line Argument(s):\n --disable-perf-graph-live\n --compute-device=cpu\n\nCommand Line Input Argument(s):\n Outputs/perf_graph_json_file=/tmp/tmptgy_j23g/validation/metadata_perf_graph_test.json\n\nCheckpoint:\n Wall Time Interval: Every 3600 s\n User Checkpoint: Disabled\n # Checkpoints Kept: 2\n Execute On: TIMESTEP_END \n\nParallelism:\n Num Processors: 1\n Num Threads: 1\n\nMesh: \n Parallel Type: replicated\n Mesh Dimension: 1\n Spatial Dimension: 1\n Nodes: 2\n Elems: 1\n Num Subdomains: 1\n\nExecution Information:\n Executioner: Steady\n Solver Mode: Preconditioned JFNK \n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n\u001b[32m Solve Skipped!\u001b[39m\n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n| 1.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n", "runner": "", - "tester": "Running csvdiff: /data/harblh/worktrees/moose/resultsstore_serialize/python/mooseutils/csvdiff.py /tmp/tmptgy_j23g/validation/gold/validation_out.csv /tmp/tmptgy_j23g/validation/validation_out.csv --relative-tolerance 5.5e-06 --abs-zero 1e-10\nFiles are the same\n\nLoading JSON metadata...\n perf_graph (/tmp/tmptgy_j23g/validation/metadata_perf_graph_test.json): loaded\n\n", - "validation": "Running validation case(s) in /tmp/tmptgy_j23g/validation/validation.py:TestCase\n\n-- Running 1 test case(s) in TestCase\n-- Running TestCase.initialize\n-- Running TestCase.testValidation\n[ OK] number: value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits\n-- Acquired 2 data value(s), 1 result(s): 1 ok, 0 fail, 0 skip\n\nRan validation case(s); 0 result(s) failed", + "tester": + "Running csvdiff: /data/harblh/worktrees/moose/resultsstore_serialize/python/mooseutils/csvdiff.py /tmp/tmptgy_j23g/validation/gold/validation_out.csv /tmp/tmptgy_j23g/validation/validation_out.csv --relative-tolerance 5.5e-06 --abs-zero 1e-10\nFiles are the same\n\nLoading JSON metadata...\n perf_graph (/tmp/tmptgy_j23g/validation/metadata_perf_graph_test.json): loaded\n\n", + "validation": + "Running validation case(s) in /tmp/tmptgy_j23g/validation/validation.py:TestCase\n\n-- Running 1 test case(s) in TestCase\n-- Running TestCase.initialize\n-- Running TestCase.testValidation\n[ OK] number: value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits\n-- Acquired 2 data value(s), 1 result(s): 1 ok, 0 fail, 0 skip\n\nRan validation case(s); 0 result(s) failed", "job": "" }, "validation": { @@ -922,7 +940,8 @@ "results": [ { "status": "OK", - "message": "value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits", + "message": + "value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits", "test": "TestCase.testValidation", "data_key": "number" } @@ -990,7 +1009,8 @@ "user": "harblh" }, "apptainer": { - "path": "/hpc-common/moose/containers/moose-dev-mpich/2025.10.27_24e4ea0512807c13a6da2d7399e7d355d05afe34240c80a8133ec9e060811f3d/moose-dev-mpich-x86_64_2025.10.27.sif", + "path": + "/hpc-common/moose/containers/moose-dev-mpich/2025.10.27_24e4ea0512807c13a6da2d7399e7d355d05afe34240c80a8133ec9e060811f3d/moose-dev-mpich-x86_64_2025.10.27.sif", "generator_library": "moose-dev", "generator_name": "moose-dev-mpich-x86_64", "generator_tag": "2025.10.27", @@ -1108,17 +1128,21 @@ }, "tester": { "name": "CSVDiff", - "command": "/tmp/tmpk_ijsgtq/moose_test-opt -i validation.i --disable-perf-graph-live --compute-device=cpu", + "command": + "/tmp/tmpk_ijsgtq/moose_test-opt -i validation.i --disable-perf-graph-live --compute-device=cpu", "input_file": "/tmp/tmpk_ijsgtq/validation/validation.i" }, "output_files": [ "/tmp/tmpk_ijsgtq/validation/validation_out.csv" ], "output": { - "runner_run": "Framework Information:\nMOOSE Version: git commit e760fe182e3 on 2025-11-03\nLibMesh Version: 910736a3a20aded528c3ba99371ce65980dc8e2c\nPETSc Version: 3.24.0\nSLEPc Version: 3.24.0\nCurrent Time: Tue Nov 11 13:43:55 2025\nExecutable Timestamp: Mon Nov 3 17:43:48 2025\n\nInput File(s):\n /tmp/tmpk_ijsgtq/validation/validation.i\n\nCommand Line Argument(s):\n --disable-perf-graph-live\n --compute-device=cpu\n\nCheckpoint:\n Wall Time Interval: Every 3600 s\n User Checkpoint: Disabled\n # Checkpoints Kept: 2\n Execute On: TIMESTEP_END \n\nParallelism:\n Num Processors: 1\n Num Threads: 1\n\nMesh: \n Parallel Type: replicated\n Mesh Dimension: 1\n Spatial Dimension: 1\n Nodes: 2\n Elems: 1\n Num Subdomains: 1\n\nExecution Information:\n Executioner: Steady\n Solver Mode: Preconditioned JFNK \n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n\u001b[32m Solve Skipped!\u001b[39m\n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n| 1.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n", + "runner_run": + "Framework Information:\nMOOSE Version: git commit e760fe182e3 on 2025-11-03\nLibMesh Version: 910736a3a20aded528c3ba99371ce65980dc8e2c\nPETSc Version: 3.24.0\nSLEPc Version: 3.24.0\nCurrent Time: Tue Nov 11 13:43:55 2025\nExecutable Timestamp: Mon Nov 3 17:43:48 2025\n\nInput File(s):\n /tmp/tmpk_ijsgtq/validation/validation.i\n\nCommand Line Argument(s):\n --disable-perf-graph-live\n --compute-device=cpu\n\nCheckpoint:\n Wall Time Interval: Every 3600 s\n User Checkpoint: Disabled\n # Checkpoints Kept: 2\n Execute On: TIMESTEP_END \n\nParallelism:\n Num Processors: 1\n Num Threads: 1\n\nMesh: \n Parallel Type: replicated\n Mesh Dimension: 1\n Spatial Dimension: 1\n Nodes: 2\n Elems: 1\n Num Subdomains: 1\n\nExecution Information:\n Executioner: Steady\n Solver Mode: Preconditioned JFNK \n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n\u001b[32m Solve Skipped!\u001b[39m\n\nPostprocessor Values:\n+----------------+----------------+\n| time | value |\n+----------------+----------------+\n| 0.000000e+00 | 2.000000e+00 |\n| 1.000000e+00 | 2.000000e+00 |\n+----------------+----------------+\n\n", "runner": "", - "tester": "Running csvdiff: /data/harblh/worktrees/moose/resultsstore_serialize/python/mooseutils/csvdiff.py /tmp/tmpk_ijsgtq/validation/gold/validation_out.csv /tmp/tmpk_ijsgtq/validation/validation_out.csv --relative-tolerance 5.5e-06 --abs-zero 1e-10\nFiles are the same\n\n", - "validation": "Running validation case(s) in /tmp/tmpk_ijsgtq/validation/validation.py:TestCase\n\n-- Running 1 test case(s) in TestCase\n-- Running TestCase.initialize\n-- Running TestCase.testValidation\n[ OK] number: value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits\n-- Acquired 2 data value(s), 1 result(s): 1 ok, 0 fail, 0 skip\n\nRan validation case(s); 0 result(s) failed", + "tester": + "Running csvdiff: /data/harblh/worktrees/moose/resultsstore_serialize/python/mooseutils/csvdiff.py /tmp/tmpk_ijsgtq/validation/gold/validation_out.csv /tmp/tmpk_ijsgtq/validation/validation_out.csv --relative-tolerance 5.5e-06 --abs-zero 1e-10\nFiles are the same\n\n", + "validation": + "Running validation case(s) in /tmp/tmpk_ijsgtq/validation/validation.py:TestCase\n\n-- Running 1 test case(s) in TestCase\n-- Running TestCase.initialize\n-- Running TestCase.testValidation\n[ OK] number: value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits\n-- Acquired 2 data value(s), 1 result(s): 1 ok, 0 fail, 0 skip\n\nRan validation case(s); 0 result(s) failed", "job": "" }, "validation": { @@ -1126,7 +1150,8 @@ "results": [ { "status": "OK", - "message": "value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits", + "message": + "value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits", "test": "TestCase.testValidation", "data_key": "number" } @@ -1194,7 +1219,8 @@ "user": "harblh" }, "apptainer": { - "path": "/hpc-common/moose/containers/moose-dev-mpich/2025.10.27_24e4ea0512807c13a6da2d7399e7d355d05afe34240c80a8133ec9e060811f3d/moose-dev-mpich-x86_64_2025.10.27.sif", + "path": + "/hpc-common/moose/containers/moose-dev-mpich/2025.10.27_24e4ea0512807c13a6da2d7399e7d355d05afe34240c80a8133ec9e060811f3d/moose-dev-mpich-x86_64_2025.10.27.sif", "generator_library": "moose-dev", "generator_name": "moose-dev-mpich-x86_64", "generator_tag": "2025.10.27", @@ -1312,7 +1338,8 @@ }, "tester": { "name": "CSVDiff", - "command": "/tmp/tmpskmkjgh3/moose_test-opt -i validation.i --disable-perf-graph-live Outputs/perf_graph_json_file=/tmp/tmpskmkjgh3/validation/metadata_perf_graph_test.json --compute-device=cpu", + "command": + "/tmp/tmpskmkjgh3/moose_test-opt -i validation.i --disable-perf-graph-live Outputs/perf_graph_json_file=/tmp/tmpskmkjgh3/validation/metadata_perf_graph_test.json --compute-device=cpu", "input_file": "/tmp/tmpskmkjgh3/validation/validation.i", "json_metadata": { "perf_graph": { @@ -1360,12 +1387,6 @@ "time": 6.871e-06 }, "FEProblem::BoundaryRestrictedNodeIntegrityCheck": { - "MeshGeneratorMesh::nodeToActiveSemilocalElemMap": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 1.4592e-05 - }, "level": 5, "memory": 0, "num_calls": 1, @@ -1610,24 +1631,26 @@ }, "MooseApp::setup": { "MooseApp::runInputFile": { - "Action::AddDefaultConvergenceAction::auto_adddefaultconvergenceaction::act": { - "level": 4, - "memory": 0, - "num_calls": 3, - "time": 0.000789951 - }, + "Action::AddDefaultConvergenceAction::auto_adddefaultconvergenceaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 3, + "time": 0.000789951 + }, "Action::AddExecutorAction::auto_addexecutoraction::act": { "level": 4, "memory": 0, "num_calls": 1, "time": 1.403e-06 }, - "Action::AddExternalAuxVariableAction::auto_addexternalauxvariableaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 6.21e-07 - }, + "Action::AddExternalAuxVariableAction::auto_addexternalauxvariableaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 6.21e-07 + }, "Action::AddMeshGeneratorAction::gmg::act": { "level": 4, "memory": 0, @@ -1664,30 +1687,33 @@ "num_calls": 1, "time": 0.000359872 }, - "Action::AddRelationshipManager::auto_addrelationshipmanager::act": { - "level": 4, - "memory": 0, - "num_calls": 7, - "time": 8.605e-06 - }, - "Action::AddTaggedMatricesAction::auto_addtaggedmatricesaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 4.307e-06 - }, + "Action::AddRelationshipManager::auto_addrelationshipmanager::act": + { + "level": 4, + "memory": 0, + "num_calls": 7, + "time": 8.605e-06 + }, + "Action::AddTaggedMatricesAction::auto_addtaggedmatricesaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 4.307e-06 + }, "Action::AutoCheckpointAction::Outputs::act": { "level": 4, "memory": 0, "num_calls": 1, "time": 0.000439482 }, - "Action::ChainControlSetupAction::auto_chaincontrolsetupaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 2.414e-06 - }, + "Action::ChainControlSetupAction::auto_chaincontrolsetupaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 2.414e-06 + }, "Action::CheckIntegrityAction::auto_checkintegrityaction::act": { "FEProblem::checkProblemIntegrity": { "level": 5, @@ -1712,30 +1738,33 @@ "num_calls": 3, "time": 0.001563767 }, - "Action::ComposeTimeStepperAction::auto_composetimestepperaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 1.6014e-05 - }, + "Action::ComposeTimeStepperAction::auto_composetimestepperaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 1.6014e-05 + }, "Action::CopyNodalVarsAction::auto_copynodalvarsaction::act": { "level": 4, "memory": 0, "num_calls": 3, "time": 3.436e-06 }, - "Action::CouplingFunctorCheckAction::auto_couplingfunctorcheckaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 2e-07 - }, - "Action::CreateAddedMeshGenerators::auto_createaddedmeshgenerators::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 0.000388155 - }, + "Action::CouplingFunctorCheckAction::auto_couplingfunctorcheckaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 2e-07 + }, + "Action::CreateAddedMeshGenerators::auto_createaddedmeshgenerators::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 0.000388155 + }, "Action::CreateDisplacedProblemAction::Mesh::act": { "level": 4, "memory": 0, @@ -1754,24 +1783,26 @@ "num_calls": 1, "time": 1.532e-06 }, - "Action::CreateProblemDefaultAction::auto_createproblemdefaultaction::act": { - "FEProblem::initNullSpaceVectors": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 8.222e-06 - }, - "level": 4, - "memory": 7, - "num_calls": 2, - "time": 0.001694595 - }, - "Action::DeclareLateReportersAction::auto_declarelatereportersaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 4.91e-07 - }, + "Action::CreateProblemDefaultAction::auto_createproblemdefaultaction::act": + { + "FEProblem::initNullSpaceVectors": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 8.222e-06 + }, + "level": 4, + "memory": 7, + "num_calls": 2, + "time": 0.001694595 + }, + "Action::DeclareLateReportersAction::auto_declarelatereportersaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 4.91e-07 + }, "Action::DisplayGhostingAction::Mesh::act": { "level": 4, "memory": 0, @@ -1796,18 +1827,19 @@ "num_calls": 3, "time": 4.61e-07 }, - "Action::ExecuteMeshGenerators::auto_executemeshgenerators::act": { - "MeshGeneratorSystem::createMeshGeneratorOrder": { - "level": 1, - "memory": 0, - "num_calls": 1, - "time": 1.8167e-05 - }, - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 0.000353383 - }, + "Action::ExecuteMeshGenerators::auto_executemeshgenerators::act": + { + "MeshGeneratorSystem::createMeshGeneratorOrder": { + "level": 1, + "memory": 0, + "num_calls": 1, + "time": 1.8167e-05 + }, + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 0.000353383 + }, "Action::InitProblemAction::auto_initproblemaction::act": { "FEProblem::init": { "FEProblem::EquationSystems::Init": { @@ -1910,12 +1942,13 @@ "num_calls": 2, "time": 0.000245329 }, - "Action::ResolveOptionalMaterialPropertiesAction::auto_resolveoptionalmaterialpropertiesaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 9.11e-07 - }, + "Action::ResolveOptionalMaterialPropertiesAction::auto_resolveoptionalmaterialpropertiesaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 9.11e-07 + }, "Action::SetupDampersAction::auto_setupdampersaction::act": { "level": 4, "memory": 0, @@ -1923,78 +1956,81 @@ "time": 5.41e-07 }, "Action::SetupMeshAction::Mesh::act": { - "Action::SetupMeshAction::Mesh::SetupMeshAction::act::set_mesh_base": { - "MeshGeneratorMesh::init": { - "level": 2, - "memory": 0, - "num_calls": 1, - "time": 1.6815e-05 - }, - "level": 1, - "memory": 0, - "num_calls": 2, - "time": 6.65e-05 - }, - "Action::SetupMeshAction::Mesh::SetupMeshAction::act::setup_mesh": { - "level": 1, - "memory": 0, - "num_calls": 1, - "time": 0.000459342 - }, + "Action::SetupMeshAction::Mesh::SetupMeshAction::act::set_mesh_base": + { + "MeshGeneratorMesh::init": { + "level": 2, + "memory": 0, + "num_calls": 1, + "time": 1.6815e-05 + }, + "level": 1, + "memory": 0, + "num_calls": 2, + "time": 6.65e-05 + }, + "Action::SetupMeshAction::Mesh::SetupMeshAction::act::setup_mesh": + { + "level": 1, + "memory": 0, + "num_calls": 1, + "time": 0.000459342 + }, "level": 4, "memory": 0, "num_calls": 3, "time": 0.00015188 }, "Action::SetupMeshCompleteAction::Mesh::act": { - "Action::SetupMeshCompleteAction::Mesh::completeSetupUndisplaced": { - "MeshGeneratorMesh::prepare": { - "MeshGeneratorMesh::detectOrthogonalDimRanges": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 9.304e-06 - }, - "MeshGeneratorMesh::setCoordSystem": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 4.8293e-05 - }, - "MeshGeneratorMesh::update": { - "MeshGeneratorMesh::buildBndElemList": { - "level": 5, + "Action::SetupMeshCompleteAction::Mesh::completeSetupUndisplaced": + { + "MeshGeneratorMesh::prepare": { + "MeshGeneratorMesh::detectOrthogonalDimRanges": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 9.304e-06 + }, + "MeshGeneratorMesh::setCoordSystem": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 4.8293e-05 + }, + "MeshGeneratorMesh::update": { + "MeshGeneratorMesh::buildBndElemList": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 1.2268e-05 + }, + "MeshGeneratorMesh::buildNodeList": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 8.713e-06 + }, + "MeshGeneratorMesh::cacheInfo": { + "level": 3, + "memory": 0, + "num_calls": 1, + "time": 2.8774e-05 + }, + "level": 3, + "memory": 0, + "num_calls": 1, + "time": 0.000143596 + }, + "level": 2, "memory": 0, - "num_calls": 1, - "time": 1.2268e-05 + "num_calls": 2, + "time": 0.000197317 }, - "MeshGeneratorMesh::buildNodeList": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 8.713e-06 - }, - "MeshGeneratorMesh::cacheInfo": { - "level": 3, - "memory": 0, - "num_calls": 1, - "time": 2.8774e-05 - }, - "level": 3, + "level": 2, "memory": 0, - "num_calls": 1, - "time": 0.000143596 + "num_calls": 2, + "time": 7.933e-05 }, - "level": 2, - "memory": 0, - "num_calls": 2, - "time": 0.000197317 - }, - "level": 2, - "memory": 0, - "num_calls": 2, - "time": 7.933e-05 - }, "Action::SetupMeshCompleteAction::Mesh::deleteRemoteElems": { "level": 2, "memory": 0, @@ -2012,36 +2048,40 @@ "num_calls": 4, "time": 0.000160723 }, - "Action::SetupQuadratureAction::auto_setupquadratureaction::act": { - "MeshGeneratorMesh::getActiveLocalElementRange": { - "level": 5, - "memory": 0, - "num_calls": 1, - "time": 8.503e-06 - }, - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 9.278e-05 - }, - "Action::SetupRecoverFileBaseAction::auto_setuprecoverfilebaseaction::act": { - "level": 4, - "memory": 0, - "num_calls": 2, - "time": 2.814e-06 - }, - "Action::SetupTimeStepperAction::auto_setuptimestepperaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 5.4e-07 - }, - "Action::StartWebServerControlAction::auto_startwebservercontrolaction::act": { - "level": 4, - "memory": 0, - "num_calls": 1, - "time": 1.2e-07 - }, + "Action::SetupQuadratureAction::auto_setupquadratureaction::act": + { + "MeshGeneratorMesh::getActiveLocalElementRange": { + "level": 5, + "memory": 0, + "num_calls": 1, + "time": 8.503e-06 + }, + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 9.278e-05 + }, + "Action::SetupRecoverFileBaseAction::auto_setuprecoverfilebaseaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 2, + "time": 2.814e-06 + }, + "Action::SetupTimeStepperAction::auto_setuptimestepperaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 5.4e-07 + }, + "Action::StartWebServerControlAction::auto_startwebservercontrolaction::act": + { + "level": 4, + "memory": 0, + "num_calls": 1, + "time": 1.2e-07 + }, "level": 3, "memory": 0, "num_calls": 1, @@ -2099,7 +2139,8 @@ "results": [ { "status": "OK", - "message": "value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits", + "message": + "value 2.000E+00 coolunits within bounds; min = 1.990E+00 coolunits, max = 2.010E+00 coolunits", "test": "TestCase.testValidation", "data_key": "number" } @@ -2149,4 +2190,4 @@ "time_average": 0.13477206230163574 } } -} \ No newline at end of file +} diff --git a/test/src/userobjects/TrackDiracFront.C b/test/src/userobjects/TrackDiracFront.C index c11b353d0ca8..0c9ada027ee2 100644 --- a/test/src/userobjects/TrackDiracFront.C +++ b/test/src/userobjects/TrackDiracFront.C @@ -64,7 +64,7 @@ TrackDiracFront::finalize() Elem * TrackDiracFront::localElementConnectedToCurrentNode() { - const std::map> & node_to_elem_map = _mesh.nodeToElemMap(); + const auto & node_to_elem_map = _mesh.nodeToElemMap(); auto node_to_elem_pair = node_to_elem_map.find(_current_node->id()); mooseAssert(node_to_elem_pair != node_to_elem_map.end(), "Node missing in node to elem map"); const std::vector & connected_elems = node_to_elem_pair->second; diff --git a/test/tests/geomsearch/quadrature_locator_plus_constraint/gold/quadrature_locator_plus_constraint_adaptivity_out.csv b/test/tests/geomsearch/quadrature_locator_plus_constraint/gold/quadrature_locator_plus_constraint_adaptivity_out.csv new file mode 100644 index 000000000000..370d2e1fb7d2 --- /dev/null +++ b/test/tests/geomsearch/quadrature_locator_plus_constraint/gold/quadrature_locator_plus_constraint_adaptivity_out.csv @@ -0,0 +1,4 @@ +time,lower_top_avg,num_dofs,upper_bottom_avg +1,0.50000000139235,16,0.50000000139235 +2,0.5,46,0.5 +3,0.5,154,0.5 diff --git a/test/tests/geomsearch/quadrature_locator_plus_constraint/quadrature_locator_plus_constraint_adaptivity.i b/test/tests/geomsearch/quadrature_locator_plus_constraint/quadrature_locator_plus_constraint_adaptivity.i new file mode 100644 index 000000000000..45d84271f04c --- /dev/null +++ b/test/tests/geomsearch/quadrature_locator_plus_constraint/quadrature_locator_plus_constraint_adaptivity.i @@ -0,0 +1,107 @@ +[Mesh] + [lower] + type = GeneratedMeshGenerator + dim = 2 + nx = 2 + ny = 1 + ymax = 0.5 + boundary_name_prefix = lower + [] + [upper] + type = GeneratedMeshGenerator + dim = 2 + nx = 2 + ny = 1 + ymin = 0.5 + ymax = 1.0 + boundary_name_prefix = upper + boundary_id_offset = 10 + [] + [combine] + type = CombinerGenerator + inputs = 'lower upper' + [] +[] + +[Problem] + use_hash_table_matrix_assembly = true +[] + +[Variables] + [T] + [] +[] + +[Kernels] + [diff] + type = Diffusion + variable = T + [] +[] + +[BCs] + [bottom] + type = DirichletBC + variable = T + boundary = lower_bottom + value = 0 + [] + [top] + type = DirichletBC + variable = T + boundary = upper_top + value = 1 + [] +[] + +[Constraints] + [tied] + type = TiedValueConstraint + variable = T + primary_variable = T + secondary = upper_bottom + primary = lower_top + [] +[] + +[Executioner] + type = Transient + solve_type = PJFNK + petsc_options_iname = '-pc_type -pc_factor_mat_solver_type' + petsc_options_value = 'lu mumps' + nl_abs_tol = 1e-12 + num_steps = 3 +[] + +[Adaptivity] + marker = uniform + [Markers] + [uniform] + type = UniformMarker + mark = REFINE + [] + [] +[] + +[Postprocessors] + [upper_bottom_avg] + type = SideAverageValue + boundary = upper_bottom + variable = T + [] + [lower_top_avg] + type = SideAverageValue + boundary = lower_top + variable = T + [] + [num_dofs] + type = NumDOFs + [] +[] + +[Outputs] + [out] + type = CSV + execute_on = TIMESTEP_END + [] +[] diff --git a/test/tests/geomsearch/quadrature_locator_plus_constraint/tests b/test/tests/geomsearch/quadrature_locator_plus_constraint/tests index 2f7a3a1eccf3..f37867469479 100644 --- a/test/tests/geomsearch/quadrature_locator_plus_constraint/tests +++ b/test/tests/geomsearch/quadrature_locator_plus_constraint/tests @@ -6,4 +6,12 @@ requirement = 'The nonlinear system shall be able to augment its sparsity based on constraints when we have a quadrature nearest-node locator.' design = 'GeometricSearchData.md' [] + [adaptivity] + type = CSVDiff + input = quadrature_locator_plus_constraint_adaptivity.i + csvdiff = quadrature_locator_plus_constraint_adaptivity_out.csv + issues = '#32747' + requirement = 'Node to face constraints shall correctly update secondary-to-primary pairings when the mesh changes due to h-adaptivity and when the matrix is assembled using hash tables.' + design = 'GeometricSearchData.md' + [] [] diff --git a/unit/files/ImplicitGeometricCouplingTest/sparsity.i b/unit/files/ImplicitGeometricCouplingTest/sparsity.i new file mode 100644 index 000000000000..b29587b45179 --- /dev/null +++ b/unit/files/ImplicitGeometricCouplingTest/sparsity.i @@ -0,0 +1,48 @@ +[Mesh] + type = GeneratedMesh + dim = 2 + nx = 4 + ny = 4 +[] + +[Variables] + [T][] +[] + +[Kernels] + [diff] + type = Diffusion + variable = T + [] +[] + +[BCs] + [bottom] + type = DirichletBC + variable = T + boundary = bottom + value = 0 + [] + [top] + type = DirichletBC + variable = T + boundary = top + value = 1 + [] +[] + +[Constraints] + [tied] + type = TiedValueConstraint + variable = T + primary_variable = T + secondary = left + primary = right + [] +[] + +[Executioner] + type = Steady +[] + +[Outputs][] diff --git a/unit/src/ImplicitGeometricCouplingTest.C b/unit/src/ImplicitGeometricCouplingTest.C new file mode 100644 index 000000000000..956ceda7460d --- /dev/null +++ b/unit/src/ImplicitGeometricCouplingTest.C @@ -0,0 +1,84 @@ +//* This file is part of the MOOSE framework +//* https://mooseframework.inl.gov +//* +//* All rights reserved, see COPYRIGHT for full restrictions +//* https://github.com/idaholab/moose/blob/master/COPYRIGHT +//* +//* Licensed under LGPL 2.1, please see LICENSE for details +//* https://www.gnu.org/licenses/lgpl-2.1.html + +#include "gtest_include.h" + +#include "Executioner.h" +#include "FEProblemBase.h" +#include "MooseMain.h" +#include "NonlinearSystem.h" + +#include "libmesh/nonlinear_implicit_system.h" +#include "libmesh/petsc_matrix.h" + +#include +#include + +namespace +{ + +/// Wraps a vector of string arguments as argc/argv with a fake executable name prepended. +struct Args +{ + Args(const std::vector & args) : _args(args) + { + _args.insert(_args.begin(), "unused"); + for (auto & arg : _args) + _argv.push_back(arg.data()); + _argv.push_back(nullptr); + } + int argc() const { return static_cast(_argv.size()) - 1; } + char ** argv() { return _argv.data(); } + std::vector _args; + std::vector _argv; +}; + +// Returns the number of stored nonzero entries in the assembled Jacobian. +// Accesses the matrix via the libMesh NonlinearImplicitSystem directly, since +// MOOSE's tag-based getMatrix() is not valid after run() returns. +PetscInt +getJacobianNNZ(FEProblemBase & fe_problem) +{ + auto * mat = + dynamic_cast *>(fe_problem.getNonlinearSystem(0).sys().matrix); + mooseAssert(mat, "Expected a PetscMatrix for the system Jacobian"); + MatInfo info; + LibmeshPetscCallA(fe_problem.comm().get(), MatGetInfo(mat->mat(), MAT_LOCAL, &info)); + return static_cast(info.nz_used); +} + +} // namespace + +// With standard (CSR) matrix assembly and a NodeFaceConstraint, MOOSE pre-populates the Jacobian +// sparsity with zeros for all potential secondary-primary element DOF pairs via +// addImplicitGeometricCouplingEntries. With hash-table matrix assembly this step is skipped +// because the format handles new entries dynamically. The result should be measurably fewer +// stored nonzeros in the hash-table case. +TEST(ImplicitGeometricCoupling, HashTableAssemblyDoesNotInflateSparsity) +{ + const std::string input = "files/ImplicitGeometricCouplingTest/sparsity.i"; + + PetscInt nnz_standard; + { + Args args({"-i", input}); + const auto app = Moose::createMooseApp("MooseUnitApp", args.argc(), args.argv()); + app->run(); + nnz_standard = getJacobianNNZ(app->getExecutioner()->feProblem()); + } + + PetscInt nnz_hash_table; + { + Args args({"-i", input, "Problem/use_hash_table_matrix_assembly=true"}); + const auto app = Moose::createMooseApp("MooseUnitApp", args.argc(), args.argv()); + app->run(); + nnz_hash_table = getJacobianNNZ(app->getExecutioner()->feProblem()); + } + + EXPECT_LT(nnz_hash_table, nnz_standard); +}