From b4200a7b867c536d8b16240b3362256783e1fbae Mon Sep 17 00:00:00 2001 From: Wenqing Wang <wenqing.wang@ufz.de> Date: Mon, 7 Jan 2019 15:53:32 +0100 Subject: [PATCH] [deactivation] Minor changes according to the comments by Dima and Tom --- ProcessLib/PhaseField/PhaseFieldProcess.cpp | 9 ++-- ProcessLib/Process.cpp | 24 ++--------- ProcessLib/Process.h | 2 +- ProcessLib/ProcessVariable.cpp | 21 +++++----- ProcessLib/ProcessVariable.h | 2 +- .../SmallDeformationNonlocalProcess.cpp | 42 +++++++++++++------ ProcessLib/UncoupledProcessesTimeLoop.cpp | 2 +- 7 files changed, 53 insertions(+), 49 deletions(-) diff --git a/ProcessLib/PhaseField/PhaseFieldProcess.cpp b/ProcessLib/PhaseField/PhaseFieldProcess.cpp index 9e93feee663..1496e1e52c5 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcess.cpp +++ b/ProcessLib/PhaseField/PhaseFieldProcess.cpp @@ -368,10 +368,13 @@ void PhaseFieldProcess<DisplacementDim>::postNonLinearSolverConcreteProcess( DBUG("PostNonLinearSolver crack volume computation."); - GlobalExecutor::executeMemberOnDereferenced( + ProcessLib::ProcessVariable const& pv + = getProcessVariables(process_id)[0]; + GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::computeCrackIntegral, _local_assemblers, - dof_tables, x, t, _process_data.crack_volume, - _use_monolithic_scheme, _coupled_solutions); + pv.getActiveElementIDs(), dof_tables, x, t, + _process_data.crack_volume, _use_monolithic_scheme, + _coupled_solutions); INFO("Integral of crack: %g", _process_data.crack_volume); diff --git a/ProcessLib/Process.cpp b/ProcessLib/Process.cpp index 34b533e3ab2..41523f2316d 100644 --- a/ProcessLib/Process.cpp +++ b/ProcessLib/Process.cpp @@ -49,7 +49,7 @@ Process::Process( return pcs_BCs; }(_process_variables.size())), _source_term_collections([&](const std::size_t number_of_processes) - -> std::vector<SourceTermCollection> { + -> std::vector<SourceTermCollection> { std::vector<SourceTermCollection> pcs_sts; pcs_sts.reserve(number_of_processes); for (std::size_t i = 0; i < number_of_processes; i++) @@ -59,23 +59,6 @@ Process::Process( return pcs_sts; }(_process_variables.size())) { - // If there are deactivated subdomains, check whether MaterialIDs exist in - // mesh data. - for (auto const& per_process_process_variables : _process_variables) - { - for (auto const& process_variable : per_process_process_variables) - { - if ((!process_variable.get() - .getDeactivatedSubdomains() - .empty()) && - (!materialIDs(mesh))) - { - OGS_FATAL( - "The mesh does not contain matertialIDs for the " - "deactivation of subdomains. The program terminates now."); - } - } - } } void Process::initializeProcessBoundaryConditionsAndSourceTerms( @@ -190,12 +173,13 @@ MathLib::MatrixSpecifications Process::getMatrixSpecifications( &l.getGhostIndices(), &_sparsity_pattern}; } -void Process::checkElementDeactivation(double const time, const int process_id) +void Process::updateDeactivatedSubdomains(double const time, + const int process_id) { auto const& variables_per_process = getProcessVariables(process_id); for (auto const& variable : variables_per_process) { - variable.get().checkElementDeactivation(time); + variable.get().updateDeactivatedSubdomains(time); } } diff --git a/ProcessLib/Process.h b/ProcessLib/Process.h index 8d6984e5bd3..d1d22bdfb41 100644 --- a/ProcessLib/Process.h +++ b/ProcessLib/Process.h @@ -90,7 +90,7 @@ public: _coupled_solutions = coupled_solutions; } - void checkElementDeactivation(double const time, const int process_id); + void updateDeactivatedSubdomains(double const time, const int process_id); bool isMonolithicSchemeUsed() const { return _use_monolithic_scheme; } virtual void setCoupledTermForTheStaggeredSchemeToLocalAssemblers() {} diff --git a/ProcessLib/ProcessVariable.cpp b/ProcessLib/ProcessVariable.cpp index caf14c5cb77..d85f0c06c46 100644 --- a/ProcessLib/ProcessVariable.cpp +++ b/ProcessLib/ProcessVariable.cpp @@ -9,8 +9,6 @@ #include "ProcessVariable.h" -#include <iostream> - #include <algorithm> #include <utility> @@ -119,7 +117,7 @@ ProcessVariable::ProcessVariable( // Boundary conditions if (auto bcs_config = - //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions} + //! \ogs_file_param{prj__process_variables__process_variable__boundary_conditions} config.getConfigSubtreeOptional("boundary_conditions")) { for ( @@ -237,10 +235,10 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( for (auto const& deactivated_subdomain : _deactivated_subdomains) { - auto const& deactivated_sudomain_meshes = - (*deactivated_subdomain).deactivated_sudomain_meshes; - for (auto const& deactivated_sudomain_mesh : - deactivated_sudomain_meshes) + auto const& deactivated_subdomain_meshes = + deactivated_subdomain->deactivated_subdomain_meshes; + for (auto const& deactivated_subdomain_mesh : + deactivated_subdomain_meshes) { for (int component_id = 0; component_id < dof_table.getNumberOfComponents(); @@ -249,16 +247,17 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( // Copy the time interval. std::unique_ptr<BaseLib::TimeInterval> time_interval = std::make_unique<BaseLib::TimeInterval>( - (*(*deactivated_subdomain).time_interval)); + *deactivated_subdomain->time_interval); auto bc = std::make_unique< DirichletBoundaryConditionWithinTimeInterval>( std::move(time_interval), parameter, - (*(*deactivated_sudomain_mesh).mesh), - (*deactivated_sudomain_mesh).inactive_nodes, dof_table, + *(deactivated_subdomain_mesh->mesh), + deactivated_subdomain_mesh->inactive_nodes, dof_table, variable_id, component_id); #ifdef USE_PETSC + // TODO: make it work under PETSc too. if (bc == nullptr) { continue; @@ -270,7 +269,7 @@ void ProcessVariable::createBoundaryConditionsForDeactivatedSubDomains( } } -void ProcessVariable::checkElementDeactivation(double const time) +void ProcessVariable::updateDeactivatedSubdomains(double const time) { if (_deactivated_subdomains.empty()) { diff --git a/ProcessLib/ProcessVariable.h b/ProcessLib/ProcessVariable.h index ef4a8855f2c..55fb76147be 100644 --- a/ProcessLib/ProcessVariable.h +++ b/ProcessLib/ProcessVariable.h @@ -63,7 +63,7 @@ public: return _deactivated_subdomains; } - void checkElementDeactivation(double const time); + void updateDeactivatedSubdomains(double const time); std::vector<std::size_t>& getActiveElementIDs() const { diff --git a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp index 1c5ca55d366..b4de897c3c8 100644 --- a/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp +++ b/ProcessLib/SmallDeformationNonlocal/SmallDeformationNonlocalProcess.cpp @@ -140,7 +140,6 @@ void SmallDeformationNonlocalProcess<DisplacementDim>:: &LocalAssemblerInterface::nonlocal, _local_assemblers, _local_assemblers); - // Set initial conditions for integration point data. for (auto const& ip_writer : _integration_point_writer) { @@ -230,10 +229,14 @@ void SmallDeformationNonlocalProcess<DisplacementDim>::assembleConcreteProcess( std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> dof_table = {std::ref(*_local_to_global_index_map)}; + + const int process_id = 0; + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; + // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( + GlobalExecutor::executeSelectedMemberDereferenced( _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers, - dof_table, t, x, M, K, b, _coupled_solutions); + pv.getActiveElementIDs(), dof_table, t, x, M, K, b, _coupled_solutions); } template <int DisplacementDim> @@ -243,10 +246,14 @@ void SmallDeformationNonlocalProcess< { DBUG("preAssemble SmallDeformationNonlocalProcess."); + const int process_id = 0; + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; + // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( + GlobalExecutor::executeSelectedMemberDereferenced( _global_assembler, &VectorMatrixAssembler::preAssemble, - _local_assemblers, *_local_to_global_index_map, t, x); + _local_assemblers, pv.getActiveElementIDs(), + *_local_to_global_index_map, t, x); } template <int DisplacementDim> @@ -262,11 +269,15 @@ void SmallDeformationNonlocalProcess<DisplacementDim>:: std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> dof_table = {std::ref(*_local_to_global_index_map)}; + + const int process_id = 0; + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; + // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( + GlobalExecutor::executeSelectedMemberDereferenced( _global_assembler, &VectorMatrixAssembler::assembleWithJacobian, - _local_assemblers, dof_table, t, x, xdot, dxdot_dx, dx_dx, M, K, b, Jac, - _coupled_solutions); + _local_assemblers, pv.getActiveElementIDs(), dof_table, t, x, xdot, + dxdot_dx, dx_dx, M, K, b, Jac, _coupled_solutions); b.copyValues(*_nodal_forces); std::transform(_nodal_forces->begin(), _nodal_forces->end(), @@ -285,9 +296,12 @@ void SmallDeformationNonlocalProcess< _process_data.dt = dt; _process_data.t = t; - GlobalExecutor::executeMemberOnDereferenced( + const int process_id = 0; + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; + + GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::preTimestep, _local_assemblers, - *_local_to_global_index_map, x, t, dt); + pv.getActiveElementIDs(), *_local_to_global_index_map, x, t, dt); } template <int DisplacementDim> @@ -300,9 +314,13 @@ SmallDeformationNonlocalProcess<DisplacementDim>::postIterationConcreteProcess( DBUG("PostNonLinearSolver crack volume computation."); - GlobalExecutor::executeMemberOnDereferenced( + const int process_id = 0; + ProcessLib::ProcessVariable const& pv = getProcessVariables(process_id)[0]; + + GlobalExecutor::executeSelectedMemberOnDereferenced( &LocalAssemblerInterface::computeCrackIntegral, _local_assemblers, - *_local_to_global_index_map, x, _process_data.crack_volume); + pv.getActiveElementIDs(), *_local_to_global_index_map, x, + _process_data.crack_volume); INFO("Integral of crack: %g", _process_data.crack_volume); diff --git a/ProcessLib/UncoupledProcessesTimeLoop.cpp b/ProcessLib/UncoupledProcessesTimeLoop.cpp index 22ed4a62feb..aaadfbe38d8 100644 --- a/ProcessLib/UncoupledProcessesTimeLoop.cpp +++ b/ProcessLib/UncoupledProcessesTimeLoop.cpp @@ -546,7 +546,7 @@ bool UncoupledProcessesTimeLoop::loop() int process_id = 0; for (auto& process_data : _per_process_data) { - process_data->process.checkElementDeactivation(t, process_id); + process_data->process.updateDeactivatedSubdomains(t, process_id); ++process_id; } -- GitLab