diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h deleted file mode 100644 index 120310b627c0c6f3ec897ddf128cf88753690118..0000000000000000000000000000000000000000 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess-impl.h +++ /dev/null @@ -1,212 +0,0 @@ -/** - * \file - * - * \copyright - * Copyright (c) 2012-2018, 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::vector<std::reference_wrapper<ProcessVariable>>>&& - process_variables, - ThermoMechanicsProcessData<DisplacementDim>&& process_data, - SecondaryVariableCollection&& secondary_variables, - NumLib::NamedFunctionCaller&& named_function_caller, - bool const use_monolithic_scheme) - : Process(mesh, std::move(jacobian_assembler), parameters, - integration_order, std::move(process_variables), - std::move(secondary_variables), std::move(named_function_caller), - use_monolithic_scheme), - _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."); - - std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> - dof_table = {std::ref(*_local_to_global_index_map)}; - // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( - _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers, - dof_table, t, x, M, K, b, _coupled_solutions); -} - -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."); - - std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> - dof_table = {std::ref(*_local_to_global_index_map)}; - // Call global assembler for each local assembly item. - GlobalExecutor::executeMemberDereferenced( - _global_assembler, &VectorMatrixAssembler::assembleWithJacobian, - _local_assemblers, dof_table, t, x, xdot, dxdot_dx, - dx_dx, M, K, b, Jac, _coupled_solutions); -} - -template <int DisplacementDim> -void ThermoMechanicsProcess<DisplacementDim>::preTimestepConcreteProcess( - GlobalVector const& x, double const t, double const dt, - const int /*process_id*/) -{ - 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, int const /*process_id*/) -{ - 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 34e7f8d39507bf6cb31306cb719514a84787e24a..529b8f3369e7b615fb1a65b2f0b832bf4d3b3d0c 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.cpp @@ -8,12 +8,204 @@ */ #include "ThermoMechanicsProcess.h" -#include "ThermoMechanicsProcess-impl.h" + +#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::vector<std::reference_wrapper<ProcessVariable>>>&& + process_variables, + ThermoMechanicsProcessData<DisplacementDim>&& process_data, + SecondaryVariableCollection&& secondary_variables, + NumLib::NamedFunctionCaller&& named_function_caller, + bool const use_monolithic_scheme) + : Process(mesh, std::move(jacobian_assembler), parameters, + integration_order, std::move(process_variables), + std::move(secondary_variables), std::move(named_function_caller), + use_monolithic_scheme), + _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."); + + std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> + dof_table = {std::ref(*_local_to_global_index_map)}; + // Call global assembler for each local assembly item. + GlobalExecutor::executeMemberDereferenced( + _global_assembler, &VectorMatrixAssembler::assemble, _local_assemblers, + dof_table, t, x, M, K, b, _coupled_solutions); +} + +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."); + + std::vector<std::reference_wrapper<NumLib::LocalToGlobalIndexMap>> + dof_table = {std::ref(*_local_to_global_index_map)}; + // Call global assembler for each local assembly item. + GlobalExecutor::executeMemberDereferenced( + _global_assembler, &VectorMatrixAssembler::assembleWithJacobian, + _local_assemblers, dof_table, t, x, xdot, dxdot_dx, + dx_dx, M, K, b, Jac, _coupled_solutions); +} + +template <int DisplacementDim> +void ThermoMechanicsProcess<DisplacementDim>::preTimestepConcreteProcess( + GlobalVector const& x, double const t, double const dt, + const int /*process_id*/) +{ + 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, int const /*process_id*/) +{ + DBUG("PostTimestep ThermoMechanicsProcess."); + + GlobalExecutor::executeMemberOnDereferenced( + &ThermoMechanicsLocalAssemblerInterface::postTimestep, + _local_assemblers, *_local_to_global_index_map, x); +} + template class ThermoMechanicsProcess<2>; template class ThermoMechanicsProcess<3>;