36 std::vector<std::unique_ptr<MeshLib::Mesh>>
const& meshes)
41 std::string mesh_name;
44#ifdef DOXYGEN_DOCU_ONLY
49 auto optional_mesh_name =
52 if (optional_mesh_name)
54 mesh_name = *optional_mesh_name;
58#ifdef DOXYGEN_DOCU_ONLY
66 auto const geometrical_set_name =
69 auto const geometry_name =
81 begin(meshes), end(meshes),
82 [&mesh_name](
auto const& mesh)
84 assert(mesh !=
nullptr);
85 return mesh->getName() == mesh_name;
87 "Required mesh with name '" + mesh_name +
"' not found.");
88 DBUG(
"Found mesh '{:s}' with id {:d}.", mesh.getName(), mesh.getID());
99 auto const compensate_non_equilibrium_initial_residuum_ptr =
102 "compensate_non_equilibrium_initial_residuum");
104 return (compensate_non_equilibrium_initial_residuum_ptr &&
105 *compensate_non_equilibrium_initial_residuum_ptr);
110 std::vector<std::unique_ptr<MeshLib::Mesh>>
const& meshes,
111 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
112 std::map<std::string,
113 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>>
const&
116 _name(config.getConfigParameter<std::string>(
"name")),
119 _n_components(config.getConfigParameter<int>(
"components")),
121 _shapefunction_order(config.getConfigParameter<unsigned>(
"order")),
122 _deactivated_subdomains(
126 config.getConfigParameter<std::string>(
"initial_condition"),
127 parameters, _n_components, &mesh)),
128 _compensate_non_equilibrium_initial_residuum(
131 DBUG(
"Constructing process variable {:s}",
_name);
135 OGS_FATAL(
"The given shape function order {:d} is not supported",
140 if (
auto bcs_config =
147 bcs_config->getConfigSubtreeList(
"boundary_condition"))
149 auto const& bc_mesh = findMeshInConfig(bc_config, meshes);
152 bc_config.getConfigParameterOptional<
int>(
"component");
160 _bc_configs.emplace_back(std::move(bc_config), bc_mesh,
166 INFO(
"No boundary conditions for process variable '{:s}' found.",
177 sts_config->getConfigSubtreeList(
"source_term"))
179 MeshLib::Mesh const& st_mesh = findMeshInConfig(st_config, meshes);
182 st_config.getConfigParameterOptional<
int>(
"component");
196 INFO(
"No source terms for process variable '{:s}' found.",
_name);
201 _is_active = getOrCreateMeshProperty<unsigned char>(
219std::vector<std::unique_ptr<BoundaryCondition>>
222 const int variable_id,
223 unsigned const integration_order,
224 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
226 std::vector<std::reference_wrapper<ProcessVariable>>
const&
227 all_process_variables_for_this_process)
229 std::vector<std::unique_ptr<BoundaryCondition>> bcs;
235 config, dof_table,
_mesh, variable_id, integration_order,
237 all_process_variables_for_this_process);
244 bcs.push_back(std::move(bc));
255 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
256 std::vector<std::unique_ptr<BoundaryCondition>>& bcs)
260 auto const& deactivated_subdomain_mesh =
261 deactivated_subdomain.deactivated_subdomain_mesh;
262 auto const* parameter = &ParameterLib::findParameter<double>(
264 bool const set_outer_nodes_dirichlet_values =
265 deactivated_subdomain.boundary_value_parameter !=
nullptr;
266 if (set_outer_nodes_dirichlet_values)
268 parameter = deactivated_subdomain.boundary_value_parameter;
271 for (
int component_id = 0;
276 auto bc = std::make_unique<DeactivatedSubdomainDirichlet>(
277 *
_is_active, deactivated_subdomain.time_interval, *parameter,
278 set_outer_nodes_dirichlet_values, deactivated_subdomain_mesh,
279 dof_table, variable_id, component_id);
288 bcs.push_back(std::move(bc));
306 [&](
auto const& ds) {
return ds.isInTimeSupportInterval(time); }))
315 auto is_active_in_subdomain = [&](std::size_t
const element_id,
318 return (!ds.isInTimeSupportInterval(time)) ||
322 auto is_active_in_all_subdomains = [&](std::size_t
const element_id) ->
bool
327 {
return is_active_in_subdomain(element_id, ds); });
331 for (std::size_t element_id = 0; element_id < number_of_elements;
334 if (is_active_in_all_subdomains(element_id))
345 (*_is_active)[id] = 1u;
351 const int variable_id,
352 unsigned const integration_order,
353 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
354 std::vector<std::reference_wrapper<ProcessVariable>>
const&
355 all_process_variables_for_this_process)
357 std::vector<std::unique_ptr<SourceTerm>> source_terms;
360 back_inserter(source_terms),
361 [&](
auto const& config)
364 config, dof_table, config.mesh, variable_id,
366 all_process_variables_for_this_process);
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition of the Mesh class.
Definition of the Node class.
std::optional< ConfigTree > getConfigSubtreeOptional(std::string const &root) const
std::optional< T > getConfigParameterOptional(std::string const ¶m) const
T getConfigParameter(std::string const ¶m) const
const Element * getElement(std::size_t idx) const
Get the element with the given index.
std::size_t getNumberOfElements() const
Get the number of elements.
int getNumberOfVariableComponents(int variable_id) const
void updateDeactivatedSubdomains(double const time)
std::vector< BoundaryConditionConfig > _bc_configs
ProcessVariable(BaseLib::ConfigTree const &config, MeshLib::Mesh &mesh, std::vector< std::unique_ptr< MeshLib::Mesh > > const &meshes, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)
MeshLib::Mesh const & getMesh() const
Returns a mesh on which the process variable is defined.
std::vector< std::unique_ptr< SourceTerm > > createSourceTerms(const NumLib::LocalToGlobalIndexMap &dof_table, const int variable_id, unsigned const integration_order, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, std::vector< std::reference_wrapper< ProcessVariable > > const &all_process_variables_for_this_process)
unsigned _shapefunction_order
std::vector< DeactivatedSubdomain > _deactivated_subdomains
std::string const & getName() const
MeshLib::PropertyVector< unsigned char > * _is_active
std::vector< std::size_t > _ids_of_active_elements
std::vector< SourceTermConfig > _source_term_configs
std::vector< std::unique_ptr< BoundaryCondition > > createBoundaryConditions(const NumLib::LocalToGlobalIndexMap &dof_table, const int variable_id, unsigned const integration_order, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, Process const &process, std::vector< std::reference_wrapper< ProcessVariable > > const &all_process_variables_for_this_process)
void createBoundaryConditionsForDeactivatedSubDomains(const NumLib::LocalToGlobalIndexMap &dof_table, const int variable_id, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, std::vector< std::unique_ptr< BoundaryCondition > > &bcs)
std::iterator_traits< InputIt >::reference findElementOrError(InputIt begin, InputIt end, Predicate predicate, std::string const &error="")
bool parseCompensateNonEquilibriumInitialResiduum(BaseLib::ConfigTree const &config)
std::unique_ptr< SourceTerm > createSourceTerm(const SourceTermConfig &config, const NumLib::LocalToGlobalIndexMap &dof_table_bulk, const MeshLib::Mesh &source_term_mesh, const int variable_id, const unsigned integration_order, const unsigned shapefunction_order, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, std::vector< std::reference_wrapper< ProcessVariable > > const &all_process_variables_for_this_process)
std::vector< DeactivatedSubdomain > createDeactivatedSubdomains(BaseLib::ConfigTree const &config, MeshLib::Mesh const &mesh, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const ¶meters, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves)
std::unique_ptr< BoundaryCondition > createBoundaryCondition(const BoundaryConditionConfig &config, const NumLib::LocalToGlobalIndexMap &dof_table, const MeshLib::Mesh &bulk_mesh, const int variable_id, const unsigned integration_order, const unsigned shapefunction_order, const std::vector< std::unique_ptr< ParameterLib::ParameterBase > > ¶meters, const Process &process, std::vector< std::reference_wrapper< ProcessVariable > > const &all_process_variables_for_this_process)
MeshLib::Mesh const & findMeshInConfig(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< MeshLib::Mesh > > const &meshes)
static PROCESSLIB_EXPORT const std::string zero_parameter_name