From 85d7b464c6f11036a94180dc147eb62464ee7fd0 Mon Sep 17 00:00:00 2001 From: Alex Lindsay Date: Thu, 2 Feb 2017 10:43:51 -0600 Subject: [PATCH] Move updateMatPropDependency into MooseObjectWarehouseBase. (#8444) - Also make material computing threads (e.g. ComputeResidualThread call the updateMatPropDependency methods) - Make sure that we don't mark as having material property dependencies simply because we call setActiveMaterialProperties in FEProblemBase/Subproblem --- .../include/base/MooseObjectWarehouseBase.h | 61 +++++++++++++++++++ framework/include/dgkernels/DGKernel.h | 2 +- .../include/materials/MaterialWarehouse.h | 12 ---- framework/src/base/ComputeElemAuxVarsThread.C | 4 ++ framework/src/base/ComputeJacobianThread.C | 8 +++ framework/src/base/ComputeResidualThread.C | 8 +++ framework/src/base/ComputeUserObjectsThread.C | 6 ++ framework/src/base/FEProblemBase.C | 15 +++-- framework/src/base/SubProblem.C | 14 +++-- framework/src/materials/MaterialWarehouse.C | 32 ---------- test/src/base/MooseTestApp.C | 2 + .../material_dependency/material_dependency.i | 15 ++++- 12 files changed, 119 insertions(+), 60 deletions(-) diff --git a/framework/include/base/MooseObjectWarehouseBase.h b/framework/include/base/MooseObjectWarehouseBase.h index e9204482ed98..899a22cb7d84 100644 --- a/framework/include/base/MooseObjectWarehouseBase.h +++ b/framework/include/base/MooseObjectWarehouseBase.h @@ -115,6 +115,14 @@ class MooseObjectWarehouseBase void updateBoundaryVariableDependency(BoundaryID id, std::set & needed_moose_vars, THREAD_ID tid = 0) const; ///@} + void updateMatPropDependency(std::set & needed_mat_props, THREAD_ID tid = 0) const; + + void updateBlockMatPropDependency(SubdomainID id, std::set & needed_mat_props, THREAD_ID tid = 0) const; + + void updateBoundaryMatPropDependency(std::set & needed_mat_props, THREAD_ID tid = 0) const; + + void updateBoundaryMatPropDependency(BoundaryID id, std::set & needed_mat_props, THREAD_ID tid = 0) const; + /** * Populates a set of covered subdomains and the associated variable names. */ @@ -160,6 +168,9 @@ class MooseObjectWarehouseBase static void updateVariableDependencyHelper(std::set & needed_moose_vars, const std::vector > & objects); + static void updateMatPropDependencyHelper(std::set & needed_mat_props, + const std::vector > & objects); + /** * Calls assert on thread id. */ @@ -539,6 +550,56 @@ MooseObjectWarehouseBase::updateVariableDependencyHelper(std::set +void +MooseObjectWarehouseBase::updateMatPropDependency(std::set & needed_mat_props, THREAD_ID tid /* = 0*/) const +{ + if (hasActiveObjects(tid)) + updateMatPropDependencyHelper(needed_mat_props, _all_objects[tid]); +} + +template +void +MooseObjectWarehouseBase::updateBlockMatPropDependency(SubdomainID id, std::set & needed_mat_props, THREAD_ID tid /* = 0*/) const +{ + if (hasActiveBlockObjects(id, tid)) + updateMatPropDependencyHelper(needed_mat_props, getActiveBlockObjects(id, tid)); +} + + +template +void +MooseObjectWarehouseBase::updateBoundaryMatPropDependency(std::set & needed_mat_props, THREAD_ID tid/* = 0*/) const +{ + if (hasActiveBoundaryObjects(tid)) + { + typename std::map > >::const_iterator it; + for (it = _active_boundary_objects[tid].begin(); it != _active_boundary_objects[tid].end(); ++it) + updateMatPropDependencyHelper(needed_mat_props, it->second); + } +} + + +template +void +MooseObjectWarehouseBase::updateBoundaryMatPropDependency(BoundaryID id, std::set & needed_mat_props, THREAD_ID tid/* = 0*/) const +{ + if (hasActiveBoundaryObjects(id, tid)) + updateMatPropDependencyHelper(needed_mat_props, getActiveBoundaryObjects(id, tid)); +} + + +template +void +MooseObjectWarehouseBase::updateMatPropDependencyHelper(std::set & needed_mat_props, const std::vector > & objects) +{ + for (typename std::vector > ::const_iterator it = objects.begin(); it != objects.end(); ++it) + { + const std::set & mp_deps = (*it)->getMatPropDependencies(); + needed_mat_props.insert(mp_deps.begin(), mp_deps.end()); + } +} + template void diff --git a/framework/include/dgkernels/DGKernel.h b/framework/include/dgkernels/DGKernel.h index 9f1317975593..cc138699dbfa 100644 --- a/framework/include/dgkernels/DGKernel.h +++ b/framework/include/dgkernels/DGKernel.h @@ -54,7 +54,7 @@ class DGKernel : public FunctionInterface, public UserObjectInterface, public NeighborCoupleableMooseVariableDependencyIntermediateInterface, - protected TwoMaterialPropertyInterface, + public TwoMaterialPropertyInterface, public Restartable, public ZeroInterface, public MeshChangedInterface diff --git a/framework/include/materials/MaterialWarehouse.h b/framework/include/materials/MaterialWarehouse.h index a94d1d7c7a49..5f689bd17ade 100644 --- a/framework/include/materials/MaterialWarehouse.h +++ b/framework/include/materials/MaterialWarehouse.h @@ -51,24 +51,12 @@ class MaterialWarehouse : public MooseObjectWarehouse */ void addObjects(MooseSharedPointer block, MooseSharedPointer neighbor, MooseSharedPointer face, THREAD_ID tid = 0); - void updateMatPropDependency(std::set & needed_mat_props, THREAD_ID tid = 0) const; - - void updateBlockMatPropDependency(SubdomainID id, std::set & needed_mat_props, THREAD_ID tid = 0) const; - - void updateBoundaryMatPropDependency(BoundaryID id, std::set & needed_mat_props, THREAD_ID tid = 0) const; - protected: /// Stroage for neighbor material objects (Block are stored in the base class) MooseObjectWarehouse _neighbor_materials; /// Stroage for face material objects (Block are stored in the base class) MooseObjectWarehouse _face_materials; - - /** - * Helper method for updating variable dependency vector - */ - static void updateMatPropDependencyHelper(std::set & needed_mat_props, - const std::vector > & material_objects); }; #endif // MATERIALWAREHOUSE_H diff --git a/framework/src/base/ComputeElemAuxVarsThread.C b/framework/src/base/ComputeElemAuxVarsThread.C index 3af4273dd0d3..4679e85a9ce9 100644 --- a/framework/src/base/ComputeElemAuxVarsThread.C +++ b/framework/src/base/ComputeElemAuxVarsThread.C @@ -54,6 +54,7 @@ ComputeElemAuxVarsThread::subdomainChanged() } std::set needed_moose_vars; + std::set needed_mat_props; if (_aux_kernels.hasActiveBlockObjects(_subdomain, _tid)) { @@ -62,11 +63,14 @@ ComputeElemAuxVarsThread::subdomainChanged() { aux->subdomainSetup(); const std::set & mv_deps = aux->getMooseVariableDependencies(); + const std::set & mp_deps = aux->getMatPropDependencies(); needed_moose_vars.insert(mv_deps.begin(), mv_deps.end()); + needed_mat_props.insert(mp_deps.begin(), mp_deps.end()); } } _fe_problem.setActiveElementalMooseVariables(needed_moose_vars, _tid); + _fe_problem.setActiveMaterialProperties(needed_mat_props, _tid); _fe_problem.prepareMaterials(_subdomain, _tid); } diff --git a/framework/src/base/ComputeJacobianThread.C b/framework/src/base/ComputeJacobianThread.C index b7688636107d..ce77d6672d14 100644 --- a/framework/src/base/ComputeJacobianThread.C +++ b/framework/src/base/ComputeJacobianThread.C @@ -167,7 +167,15 @@ ComputeJacobianThread::subdomainChanged() _dg_kernels.updateBlockVariableDependency(_subdomain, needed_moose_vars, _tid); _interface_kernels.updateBoundaryVariableDependency(needed_moose_vars, _tid); + // Update material dependencies + std::set needed_mat_props; + _kernels.updateBlockMatPropDependency(_subdomain, needed_mat_props, _tid); + _integrated_bcs.updateBoundaryMatPropDependency(needed_mat_props, _tid); + _dg_kernels.updateBlockMatPropDependency(_subdomain, needed_mat_props, _tid); + _interface_kernels.updateBoundaryMatPropDependency(needed_mat_props, _tid); + _fe_problem.setActiveElementalMooseVariables(needed_moose_vars, _tid); + _fe_problem.setActiveMaterialProperties(needed_mat_props, _tid); _fe_problem.prepareMaterials(_subdomain, _tid); } diff --git a/framework/src/base/ComputeResidualThread.C b/framework/src/base/ComputeResidualThread.C index 00a5bbe76d7c..65cac52cee2f 100644 --- a/framework/src/base/ComputeResidualThread.C +++ b/framework/src/base/ComputeResidualThread.C @@ -69,7 +69,15 @@ ComputeResidualThread::subdomainChanged() _dg_kernels.updateBlockVariableDependency(_subdomain, needed_moose_vars, _tid); _interface_kernels.updateBoundaryVariableDependency(needed_moose_vars, _tid); + // Update material dependencies + std::set needed_mat_props; + _kernels.updateBlockMatPropDependency(_subdomain, needed_mat_props, _tid); + _integrated_bcs.updateBoundaryMatPropDependency(needed_mat_props, _tid); + _dg_kernels.updateBlockMatPropDependency(_subdomain, needed_mat_props, _tid); + _interface_kernels.updateBoundaryMatPropDependency(needed_mat_props, _tid); + _fe_problem.setActiveElementalMooseVariables(needed_moose_vars, _tid); + _fe_problem.setActiveMaterialProperties(needed_mat_props, _tid); _fe_problem.prepareMaterials(_subdomain, _tid); } diff --git a/framework/src/base/ComputeUserObjectsThread.C b/framework/src/base/ComputeUserObjectsThread.C index ef10ffb03432..6929dc8ac822 100644 --- a/framework/src/base/ComputeUserObjectsThread.C +++ b/framework/src/base/ComputeUserObjectsThread.C @@ -61,11 +61,17 @@ ComputeUserObjectsThread::subdomainChanged() _side_user_objects.updateBoundaryVariableDependency(needed_moose_vars, _tid); _internal_side_user_objects.updateBlockVariableDependency(_subdomain, needed_moose_vars, _tid); + std::set needed_mat_props; + _elemental_user_objects.updateBlockMatPropDependency(_subdomain, needed_mat_props, _tid); + _side_user_objects.updateBoundaryMatPropDependency(needed_mat_props, _tid); + _internal_side_user_objects.updateBlockMatPropDependency(_subdomain, needed_mat_props, _tid); + _elemental_user_objects.subdomainSetup(_subdomain, _tid); _side_user_objects.subdomainSetup(_tid); _internal_side_user_objects.subdomainSetup(_subdomain, _tid); _fe_problem.setActiveElementalMooseVariables(needed_moose_vars, _tid); + _fe_problem.setActiveMaterialProperties(needed_mat_props, _tid); _fe_problem.prepareMaterials(_subdomain, _tid); } diff --git a/framework/src/base/FEProblemBase.C b/framework/src/base/FEProblemBase.C index 57d8f05a8550..87194f7695e4 100644 --- a/framework/src/base/FEProblemBase.C +++ b/framework/src/base/FEProblemBase.C @@ -2018,11 +2018,10 @@ FEProblemBase::prepareMaterials(SubdomainID blk_id, THREAD_ID tid) std::set needed_moose_vars; std::set needed_mat_props; - if (_all_materials.hasActiveBlockObjects(blk_id, tid)) { _all_materials.updateVariableDependency(needed_moose_vars, tid); - _all_materials.updateMatPropDependency(needed_mat_props, tid); + _all_materials.updateBlockMatPropDependency(blk_id, needed_mat_props, tid); } const std::set & ids = _mesh.getSubdomainBoundaryIds(blk_id); @@ -2035,18 +2034,18 @@ FEProblemBase::prepareMaterials(SubdomainID blk_id, THREAD_ID tid) const std::set & current_active_elemental_moose_variables = getActiveElementalMooseVariables(tid); needed_moose_vars.insert(current_active_elemental_moose_variables.begin(), current_active_elemental_moose_variables.end()); - if (!needed_moose_vars.empty()) - setActiveElementalMooseVariables(needed_moose_vars, tid); + const std::set & current_active_material_properties = getActiveMaterialProperties(tid); + needed_mat_props.insert(current_active_material_properties.begin(), current_active_material_properties.end()); - if (!needed_mat_props.empty()) - setActiveMaterialProperties(needed_mat_props, tid); + setActiveElementalMooseVariables(needed_moose_vars, tid); + setActiveMaterialProperties(needed_mat_props, tid); } void FEProblemBase::reinitMaterials(SubdomainID blk_id, THREAD_ID tid, bool swap_stateful) { - // if (_all_materials.hasActiveBlockObjects(blk_id, tid)) - if (_all_materials.hasActiveBlockObjects(blk_id, tid) && this->hasActiveMaterialProperties(tid)) + if (_all_materials.hasActiveBlockObjects(blk_id, tid)) + // if (_all_materials.hasActiveBlockObjects(blk_id, tid) && this->hasActiveMaterialProperties(tid)) { const Elem * & elem = _assembly[tid]->elem(); unsigned int n_points = _assembly[tid]->qRule()->n_points(); diff --git a/framework/src/base/SubProblem.C b/framework/src/base/SubProblem.C index b4a5ded64e71..6a86d502bc15 100644 --- a/framework/src/base/SubProblem.C +++ b/framework/src/base/SubProblem.C @@ -51,8 +51,11 @@ SubProblem::~SubProblem() void SubProblem::setActiveElementalMooseVariables(const std::set & moose_vars, THREAD_ID tid) { - _has_active_elemental_moose_variables[tid] = 1; - _active_elemental_moose_variables[tid] = moose_vars; + if (!moose_vars.empty()) + { + _has_active_elemental_moose_variables[tid] = 1; + _active_elemental_moose_variables[tid] = moose_vars; + } } const std::set & @@ -77,8 +80,11 @@ SubProblem::clearActiveElementalMooseVariables(THREAD_ID tid) void SubProblem::setActiveMaterialProperties(const std::set & mat_prop_ids, THREAD_ID tid) { - _has_active_material_property_ids[tid] = 1; - _active_material_property_ids[tid] = mat_prop_ids; + if (!mat_prop_ids.empty()) + { + _has_active_material_property_ids[tid] = 1; + _active_material_property_ids[tid] = mat_prop_ids; + } } const std::set & diff --git a/framework/src/materials/MaterialWarehouse.C b/framework/src/materials/MaterialWarehouse.C index de1f099bd3d1..387a7ba565af 100644 --- a/framework/src/materials/MaterialWarehouse.C +++ b/framework/src/materials/MaterialWarehouse.C @@ -104,35 +104,3 @@ MaterialWarehouse::sort(THREAD_ID tid /*=0*/) _neighbor_materials.sort(tid); _face_materials.sort(tid); } - - -void -MaterialWarehouse::updateMatPropDependency(std::set & needed_mat_props, THREAD_ID tid /* = 0*/) const -{ - if (hasActiveObjects(tid)) - updateMatPropDependencyHelper(needed_mat_props, _all_objects[tid]); -} - -void -MaterialWarehouse::updateBlockMatPropDependency(SubdomainID id, std::set & needed_mat_props, THREAD_ID tid /* = 0*/) const -{ - if (hasActiveBlockObjects(id, tid)) - updateMatPropDependencyHelper(needed_mat_props, getActiveBlockObjects(id, tid)); -} - -void -MaterialWarehouse::updateBoundaryMatPropDependency(BoundaryID id, std::set & needed_mat_props, THREAD_ID tid/* = 0*/) const -{ - if (hasActiveBoundaryObjects(id, tid)) - updateMatPropDependencyHelper(needed_mat_props, getActiveBoundaryObjects(id, tid)); -} - -void -MaterialWarehouse::updateMatPropDependencyHelper(std::set & needed_mat_props, const std::vector > & material_objects) -{ - for (std::vector > ::const_iterator it = material_objects.begin(); it != material_objects.end(); ++it) - { - const std::set & mp_deps = (*it)->getMatPropDependencies(); - needed_mat_props.insert(mp_deps.begin(), mp_deps.end()); - } -} diff --git a/test/src/base/MooseTestApp.C b/test/src/base/MooseTestApp.C index fce505b5bfd1..5485faeb8439 100644 --- a/test/src/base/MooseTestApp.C +++ b/test/src/base/MooseTestApp.C @@ -127,6 +127,7 @@ #include "DataStructIC.h" // Materials +#include "ErrorMaterial.h" #include "MTMaterial.h" #include "TypesMaterial.h" #include "StatefulMaterial.h" @@ -426,6 +427,7 @@ MooseTestApp::registerObjects(Factory & factory) // Materials registerMaterial(MTMaterial); + registerMaterial(ErrorMaterial); registerMaterial(TypesMaterial); registerMaterial(StatefulMaterial); registerMaterial(SpatialStatefulMaterial); diff --git a/test/tests/materials/material_dependency/material_dependency.i b/test/tests/materials/material_dependency/material_dependency.i index 783319d4cadb..83b85f12b037 100644 --- a/test/tests/materials/material_dependency/material_dependency.i +++ b/test/tests/materials/material_dependency/material_dependency.i @@ -11,6 +11,11 @@ [] [Kernels] + # [./diff] + # type = MatDiffusion + # variable = u + # prop_name = 'diff' + # [../] [./diff] type = Diffusion variable = u @@ -33,10 +38,14 @@ [] [Materials] + # [./block] + # type = GenericConstantMaterial + # prop_names = 'diff' + # prop_values = '1' + # block = 0 + # [../] [./block] - type = GenericConstantMaterial - prop_names = 'diff' - prop_values = '1' + type = ErrorMaterial block = 0 [../] []