From f2b8eb89f528d8e6e5e37b31565864773fc435b4 Mon Sep 17 00:00:00 2001 From: Dmitri Naumov <github@naumov.de> Date: Wed, 30 Aug 2017 00:08:16 +0200 Subject: [PATCH] [PL] TM: Split TMProcess-impl.h. --- .../ThermoMechanicsProcess-impl.h | 204 ++++++++++++++++++ .../ThermoMechanicsProcess.cpp | 1 + .../ThermoMechanics/ThermoMechanicsProcess.h | 157 +------------- 3 files changed, 215 insertions(+), 147 deletions(-) create mode 100644 ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h new file mode 100644 index 00000000000..25fc9223234 --- /dev/null +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h @@ -0,0 +1,204 @@ +/** + * \file + * + * \copyright + * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) + * Distributed under a Modified BSD License. + * See accompanying file LICENSE.txt or + * http://www.opengeosys.org/project/license + * + */ + +#pragma once + +#include <cassert> + +#include "BaseLib/Functional.h" +#include "ProcessLib/SmallDeformation/CreateLocalAssemblers.h" + +#include "ThermoMechanicsFEM.h" + +namespace ProcessLib +{ +namespace ThermoMechanics +{ +template <int DisplacementDim> +ThermoMechanicsProcess<DisplacementDim>::ThermoMechanicsProcess( + MeshLib::Mesh& mesh, + std::unique_ptr<ProcessLib::AbstractJacobianAssembler>&& jacobian_assembler, + std::vector<std::unique_ptr<ParameterBase>> const& parameters, + unsigned const integration_order, + std::vector<std::reference_wrapper<ProcessVariable>>&& process_variables, + ThermoMechanicsProcessData<DisplacementDim>&& process_data, + SecondaryVariableCollection&& secondary_variables, + NumLib::NamedFunctionCaller&& named_function_caller) + : Process(mesh, std::move(jacobian_assembler), parameters, + integration_order, std::move(process_variables), + std::move(secondary_variables), std::move(named_function_caller)), + _process_data(std::move(process_data)) +{ +} + +template <int DisplacementDim> +bool ThermoMechanicsProcess<DisplacementDim>::isLinear() const +{ + return false; +} + +template <int DisplacementDim> +void ThermoMechanicsProcess<DisplacementDim>::initializeConcreteProcess( + NumLib::LocalToGlobalIndexMap const& dof_table, + MeshLib::Mesh const& mesh, + unsigned const integration_order) +{ + ProcessLib::SmallDeformation::createLocalAssemblers< + DisplacementDim, ThermoMechanicsLocalAssembler>( + mesh.getElements(), dof_table, _local_assemblers, + mesh.isAxiallySymmetric(), integration_order, _process_data); + + // TODO move the two data members somewhere else. + // for extrapolation of secondary variables + std::vector<MeshLib::MeshSubsets> all_mesh_subsets_single_component; + all_mesh_subsets_single_component.emplace_back( + _mesh_subset_all_nodes.get()); + _local_to_global_index_map_single_component.reset( + new NumLib::LocalToGlobalIndexMap( + std::move(all_mesh_subsets_single_component), + // by location order is needed for output + NumLib::ComponentOrder::BY_LOCATION)); + + Base::_secondary_variables.addSecondaryVariable( + "sigma_xx", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXX)); + + Base::_secondary_variables.addSecondaryVariable( + "sigma_yy", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYY)); + + Base::_secondary_variables.addSecondaryVariable( + "sigma_zz", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaZZ)); + + Base::_secondary_variables.addSecondaryVariable( + "sigma_xy", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXY)); + + if (DisplacementDim == 3) + { + Base::_secondary_variables.addSecondaryVariable( + "sigma_xz", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXZ)); + + Base::_secondary_variables.addSecondaryVariable( + "sigma_yz", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYZ)); + } + Base::_secondary_variables.addSecondaryVariable( + "epsilon_xx", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXX)); + + Base::_secondary_variables.addSecondaryVariable( + "epsilon_yy", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonYY)); + + Base::_secondary_variables.addSecondaryVariable( + "epsilon_zz", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonZZ)); + + Base::_secondary_variables.addSecondaryVariable( + "epsilon_xy", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXY)); + if (DisplacementDim == 3) + { + Base::_secondary_variables.addSecondaryVariable( + "epsilon_yz", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonYZ)); + + Base::_secondary_variables.addSecondaryVariable( + "epsilon_xz", + makeExtrapolator( + 1, getExtrapolator(), _local_assemblers, + &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXZ)); + } +} + +template <int DisplacementDim> +void ThermoMechanicsProcess<DisplacementDim>::assembleConcreteProcess( + const double t, GlobalVector const& x, GlobalMatrix& M, GlobalMatrix& K, + GlobalVector& b) +{ + DBUG("Assemble ThermoMechanicsProcess."); + + // Call global assembler for each local assembly item. + GlobalExecutor::executeMemberDereferenced( + _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers, + *_local_to_global_index_map, t, x, M, K, b, _coupling_term); +} + +template <int DisplacementDim> +void ThermoMechanicsProcess<DisplacementDim>:: + assembleWithJacobianConcreteProcess(const double t, GlobalVector const& x, + GlobalVector const& xdot, + const double dxdot_dx, + const double dx_dx, GlobalMatrix& M, + GlobalMatrix& K, GlobalVector& b, + GlobalMatrix& Jac) +{ + DBUG("AssembleJacobian ThermoMechanicsProcess."); + + // Call global assembler for each local assembly item. + GlobalExecutor::executeMemberDereferenced( + _global_assembler, &VectorMatrixAssembler::assembleWithJacobian, + _local_assemblers, *_local_to_global_index_map, t, x, xdot, dxdot_dx, + dx_dx, M, K, b, Jac, _coupling_term); +} + +template <int DisplacementDim> +void ThermoMechanicsProcess<DisplacementDim>::preTimestepConcreteProcess( + GlobalVector const& x, double const t, double const dt) +{ + DBUG("PreTimestep ThermoMechanicsProcess."); + + _process_data.dt = dt; + _process_data.t = t; + + GlobalExecutor::executeMemberOnDereferenced( + &ThermoMechanicsLocalAssemblerInterface::preTimestep, _local_assemblers, + *_local_to_global_index_map, x, t, dt); +} + +template <int DisplacementDim> +void ThermoMechanicsProcess<DisplacementDim>::postTimestepConcreteProcess( + GlobalVector const& x) +{ + DBUG("PostTimestep ThermoMechanicsProcess."); + + GlobalExecutor::executeMemberOnDereferenced( + &ThermoMechanicsLocalAssemblerInterface::postTimestep, + _local_assemblers, *_local_to_global_index_map, x); +} + +} // namespace ThermoMechanics +} // namespace ProcessLib diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp index d13a871acbc..9b391011d73 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp @@ -8,6 +8,7 @@ */ #include "ThermoMechanicsProcess.h" +#include "ThermoMechanicsProcess-impl.h" namespace ProcessLib { diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h index e0d9339821f..23f8d0552cc 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h @@ -9,11 +9,7 @@ #pragma once -#include <cassert> - -#include "NumLib/DOF/DOFTableUtil.h" #include "ProcessLib/Process.h" -#include "ProcessLib/SmallDeformation/CreateLocalAssemblers.h" #include "ThermoMechanicsFEM.h" #include "ThermoMechanicsProcessData.h" @@ -38,19 +34,11 @@ public: process_variables, ThermoMechanicsProcessData<DisplacementDim>&& process_data, SecondaryVariableCollection&& secondary_variables, - NumLib::NamedFunctionCaller&& named_function_caller) - : Process(mesh, std::move(jacobian_assembler), parameters, - integration_order, std::move(process_variables), - std::move(secondary_variables), - std::move(named_function_caller)), - _process_data(std::move(process_data)) - { - } + NumLib::NamedFunctionCaller&& named_function_caller); //! \name ODESystem interface //! @{ - - bool isLinear() const override { return false; } + bool isLinear() const override; //! @} private: @@ -59,149 +47,21 @@ private: void initializeConcreteProcess( NumLib::LocalToGlobalIndexMap const& dof_table, MeshLib::Mesh const& mesh, - unsigned const integration_order) override - { - ProcessLib::SmallDeformation::createLocalAssemblers< - DisplacementDim, ThermoMechanicsLocalAssembler>( - mesh.getElements(), dof_table, _local_assemblers, - mesh.isAxiallySymmetric(), integration_order, _process_data); - - // TODO move the two data members somewhere else. - // for extrapolation of secondary variables - std::vector<MeshLib::MeshSubsets> all_mesh_subsets_single_component; - all_mesh_subsets_single_component.emplace_back( - _mesh_subset_all_nodes.get()); - _local_to_global_index_map_single_component.reset( - new NumLib::LocalToGlobalIndexMap( - std::move(all_mesh_subsets_single_component), - // by location order is needed for output - NumLib::ComponentOrder::BY_LOCATION)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_xx", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXX)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_yy", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYY)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_zz", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaZZ)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_xy", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXY)); - - if (DisplacementDim == 3) - { - Base::_secondary_variables.addSecondaryVariable( - "sigma_xz", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaXZ)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_yz", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtSigmaYZ)); - } - Base::_secondary_variables.addSecondaryVariable( - "epsilon_xx", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXX)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_yy", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonYY)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_zz", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonZZ)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_xy", - makeExtrapolator( - 1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface::getIntPtEpsilonXY)); - if (DisplacementDim == 3) - { - Base::_secondary_variables.addSecondaryVariable( - "epsilon_yz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface:: - getIntPtEpsilonYZ)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_xz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &ThermoMechanicsLocalAssemblerInterface:: - getIntPtEpsilonXZ)); - } - } + unsigned const integration_order) override; void assembleConcreteProcess( const double t, GlobalVector const& x, GlobalMatrix& M, GlobalMatrix& K, - GlobalVector& b) override - { - DBUG("Assemble ThermoMechanicsProcess."); - - // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( - _global_assembler, &VectorMatrixAssembler::assemble, - _local_assemblers, *_local_to_global_index_map, t, x, M, K, b, - _coupling_term); - } + GlobalVector& b) override; void assembleWithJacobianConcreteProcess( const double t, GlobalVector const& x, GlobalVector const& xdot, const double dxdot_dx, const double dx_dx, GlobalMatrix& M, - GlobalMatrix& K, GlobalVector& b, GlobalMatrix& Jac) override - { - DBUG("AssembleJacobian ThermoMechanicsProcess."); - - // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( - _global_assembler, &VectorMatrixAssembler::assembleWithJacobian, - _local_assemblers, *_local_to_global_index_map, t, x, xdot, - dxdot_dx, dx_dx, M, K, b, Jac, _coupling_term); - } + GlobalMatrix& K, GlobalVector& b, GlobalMatrix& Jac) override; void preTimestepConcreteProcess(GlobalVector const& x, double const t, - double const dt) override - { - DBUG("PreTimestep ThermoMechanicsProcess."); + double const dt) override; - _process_data.dt = dt; - _process_data.t = t; - - GlobalExecutor::executeMemberOnDereferenced( - &ThermoMechanicsLocalAssemblerInterface::preTimestep, - _local_assemblers, *_local_to_global_index_map, x, t, dt); - } - - void postTimestepConcreteProcess(GlobalVector const& x) override - { - DBUG("PostTimestep ThermoMechanicsProcess."); - - GlobalExecutor::executeMemberOnDereferenced( - &ThermoMechanicsLocalAssemblerInterface::postTimestep, - _local_assemblers, *_local_to_global_index_map, x); - } + void postTimestepConcreteProcess(GlobalVector const& x) override; private: std::vector<MeshLib::Node*> _base_nodes; @@ -214,5 +74,8 @@ private: _local_to_global_index_map_single_component; }; +extern template class ThermoMechanicsProcess<2>; +extern template class ThermoMechanicsProcess<3>; + } // namespace ThermoMechanics } // namespace ProcessLib -- GitLab