30 std::vector<std::unique_ptr<MeshLib::Mesh>>
const& meshes)
35 std::vector<std::string>
39#ifdef DOXYGEN_DOCU_ONLY
44 auto optional_mesh_name =
48 if (optional_mesh_name)
50 mesh_names.emplace_back(*optional_mesh_name);
51 INFO(
"Configure mesh '{}' for boundary condition or source term.",
55 auto const geometrical_set_name =
60#ifdef DOXYGEN_DOCU_ONLY
67 auto const geometry_name =
72 *geometrical_set_name, geometry_name));
75 auto const meshes_config =
80 for (
auto mesh_config : meshes_config->getConfigParameterList(
"mesh"))
82 mesh_names.push_back(mesh_config.getValue<std::string>());
83 INFO(
"Configure mesh '{:s}' for boundary condition.",
91 std::vector<std::reference_wrapper<const MeshLib::Mesh>> bc_meshes;
92 for (
auto const& mesh_name : mesh_names)
95 DBUG(
"Found mesh '{:s}' with id {:d}.", mesh_name,
96 bc_meshes.back().get().getID());
107 std::vector<std::unique_ptr<MeshLib::Mesh>>
const& meshes,
108 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
109 std::map<std::string,
110 std::unique_ptr<MathLib::PiecewiseLinearInterpolation>>
const&
113 _name(config.getConfigParameter<std::string>(
"name")),
123 config.getConfigParameter<std::string>(
"initial_condition"),
127 config.getConfigParameter<bool>(
128 "compensate_non_equilibrium_initial_residuum", false))
130 DBUG(
"Constructing process variable {:s}",
_name);
134 OGS_FATAL(
"The given shape function order {:d} is not supported",
139 if (
auto bcs_config =
146 bcs_config->getConfigSubtreeList(
"boundary_condition"))
148 auto const bc_meshes = findMeshInConfig(bc_config, meshes);
151 bc_config.getConfigParameterOptional<
int>(
"component");
160 std::move(bc_config), bc_meshes, component_id,
166 INFO(
"No boundary conditions for process variable '{:s}' found.",
177 sts_config->getConfigSubtreeList(
"source_term"))
179 auto st_meshes = findMeshInConfig(st_config, meshes);
182 st_config.getConfigParameterOptional<
int>(
"component");
185 st_config.peekConfigParameter<std::string>(
"type");
194 else if (type ==
"Anchor")
199 else if (type ==
"EmbeddedAnchor")
207 "Specifying the component id (<component>) for a "
208 "source term for a non-scalar process variable is "
214 st_meshes.front(), *component_id);
219 INFO(
"No source terms for process variable '{:s}' found.",
_name);
224 _is_active = getOrCreateMeshProperty<unsigned char>(
237std::vector<std::unique_ptr<BoundaryCondition>>
240 const int variable_id,
241 unsigned const integration_order,
242 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
244 std::vector<std::reference_wrapper<ProcessVariable>>
const&
245 all_process_variables_for_this_process,
246 std::map<
int, std::shared_ptr<MaterialPropertyLib::Medium>>
const& media)
248 std::vector<std::unique_ptr<BoundaryCondition>> bcs;
254 config, dof_table,
_mesh, variable_id, integration_order,
256 all_process_variables_for_this_process, media);
257 for (
auto& bc : bc_vec)
263 bcs.push_back(std::move(bc));
280 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
281 std::vector<std::unique_ptr<BoundaryCondition>>& bcs)
285 auto const& deactivated_subdomain_mesh =
286 deactivated_subdomain.deactivated_subdomain_mesh;
289 bool const set_outer_nodes_dirichlet_values =
290 deactivated_subdomain.boundary_value_parameter !=
nullptr;
291 if (set_outer_nodes_dirichlet_values)
293 parameter = deactivated_subdomain.boundary_value_parameter;
296 for (
int component_id = 0;
301 auto bc = std::make_unique<DeactivatedSubdomainDirichlet>(
302 *
_is_active, deactivated_subdomain.time_interval, *parameter,
303 set_outer_nodes_dirichlet_values, deactivated_subdomain_mesh,
304 dof_table, variable_id, component_id);
313 bcs.push_back(std::move(bc));
331 {
return ds.isInTimeSupportInterval(time); }))
340 auto is_active_in_subdomain = [&](std::size_t
const element_id,
343 return (!ds.isInTimeSupportInterval(time)) ||
344 !ds.isDeactivated(*
_mesh.getElement(element_id), time);
347 auto is_active_in_all_subdomains = [&](std::size_t
const element_id) ->
bool
352 {
return is_active_in_subdomain(element_id, ds); });
355 auto const number_of_elements =
_mesh.getNumberOfElements();
356 for (std::size_t element_id = 0; element_id < number_of_elements;
359 if (is_active_in_all_subdomains(element_id))
370 (*_is_active)[id] = 1u;
376 unsigned const integration_order,
377 std::vector<std::unique_ptr<ParameterLib::ParameterBase>>
const& parameters,
378 std::vector<std::reference_wrapper<ProcessVariable>>
const&
379 all_process_variables_for_this_process,
382 std::vector<std::unique_ptr<SourceTermBase>> source_terms;
385 back_inserter(source_terms),
386 [&](
auto const& config)
389 config, dof_table, config.mesh, variable_id,
391 all_process_variables_for_this_process, bulk_mesh);
void INFO(fmt::format_string< Args... > fmt, Args &&... args)
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
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
int getNumberOfVariableComponents(int variable_id) const
void updateDeactivatedSubdomains(double const time)
std::vector< std::unique_ptr< SourceTermBase > > 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, const MeshLib::Mesh &bulk_mesh)
ParameterLib::Parameter< double > const & _initial_condition
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.
unsigned _shapefunction_order
std::vector< DeactivatedSubdomain > _deactivated_subdomains
const bool _compensate_non_equilibrium_initial_residuum
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, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
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)
Mesh & findMeshByName(std::vector< std::unique_ptr< Mesh > > const &meshes, std::string_view const name)
OGS_NO_DANGLING Parameter< ParameterDataType > & findParameter(std::string const ¶meter_name, std::vector< std::unique_ptr< ParameterBase > > const ¶meters, int const num_components, MeshLib::Mesh const *const mesh=nullptr)
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< SourceTermBase > 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, const MeshLib::Mesh &bulk_mesh)
std::vector< 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, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
std::vector< std::reference_wrapper< const MeshLib::Mesh > > findMeshInConfig(BaseLib::ConfigTree const &config, std::vector< std::unique_ptr< MeshLib::Mesh > > const &meshes)
static PROCESSLIB_EXPORT const std::string zero_parameter_name