OGS
ProcessLib::HeatTransportBHE Namespace Reference

Namespaces

namespace  BHE
 
namespace  detail
 

Classes

class  BHEBottomDirichletBoundaryCondition
 
class  BHEInflowDirichletBoundaryCondition
 
struct  BHEMeshData
 
class  HeatTransportBHELocalAssemblerBHE
 
class  HeatTransportBHELocalAssemblerInterface
 
class  HeatTransportBHELocalAssemblerSoil
 
class  HeatTransportBHEProcess
 
struct  HeatTransportBHEProcessData
 
struct  IntegrationPointDataBHE
 
struct  IntegrationPointDataSoil
 
class  LocalDataInitializer
 
struct  SecondaryData
 

Functions

BHEMeshData getBHEDataInMesh (MeshLib::Mesh const &mesh)
 
std::unique_ptr< BHEBottomDirichletBoundaryConditioncreateBHEBottomDirichletBoundaryCondition (std::pair< GlobalIndexType, GlobalIndexType > &&in_out_global_indices)
 
template<typename BHEUpdateCallback >
std::unique_ptr< BHEInflowDirichletBoundaryCondition< BHEUpdateCallback > > createBHEInflowDirichletBoundaryCondition (std::pair< GlobalIndexType, GlobalIndexType > &&in_out_global_indices, BHEUpdateCallback bhe_update_callback)
 
std::unique_ptr< ProcesscreateHeatTransportBHEProcess (std::string const &name, MeshLib::Mesh &mesh, std::unique_ptr< ProcessLib::AbstractJacobianAssembler > &&jacobian_assembler, std::vector< ProcessVariable > const &variables, std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const &parameters, unsigned const integration_order, BaseLib::ConfigTree const &config, std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const &curves, std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const &media)
 
template<template< typename > class LocalAssemblerSoilImplementation, template< typename, typename > class LocalAssemblerBHEImplementation, typename LocalAssemblerInterface , typename... ExtraCtorArgs>
void createLocalAssemblers (std::vector< MeshLib::Element * > const &mesh_elements, NumLib::LocalToGlobalIndexMap const &dof_table, std::vector< std::unique_ptr< LocalAssemblerInterface > > &local_assemblers, NumLib::IntegrationOrder const integration_order, ExtraCtorArgs &&... extra_ctor_args)
 

Function Documentation

◆ createBHEBottomDirichletBoundaryCondition()

std::unique_ptr< BHEBottomDirichletBoundaryCondition > ProcessLib::HeatTransportBHE::createBHEBottomDirichletBoundaryCondition ( std::pair< GlobalIndexType, GlobalIndexType > && in_out_global_indices)

Definition at line 32 of file BHEBottomDirichletBoundaryCondition.cpp.

34{
35 DBUG("Constructing BHEBottomDirichletBoundaryCondition.");
36
37 // In case of partitioned mesh the boundary could be empty, i.e. there is no
38 // boundary condition.
39#ifdef USE_PETSC
40 // For this special boundary condition the boundary condition is not empty
41 // if the global indices are non-negative.
42 if (in_out_global_indices.first < 0 && in_out_global_indices.second < 0)
43 {
44 return nullptr;
45 }
46 // If only one of the global indices (in or out) is negative the
47 // implementation is not valid.
48 if (in_out_global_indices.first < 0 || in_out_global_indices.second < 0)
49 {
51 "The partition cuts the BHE into two independent parts. This "
52 "behaviour is not implemented.");
53 }
54#endif // USE_PETSC
55
56 return std::make_unique<BHEBottomDirichletBoundaryCondition>(
57 std::move(in_out_global_indices));
58}
#define OGS_FATAL(...)
Definition Error.h:26
void DBUG(fmt::format_string< Args... > fmt, Args &&... args)
Definition Logging.h:30

References DBUG(), and OGS_FATAL.

Referenced by ProcessLib::HeatTransportBHE::HeatTransportBHEProcess::createBHEBoundaryConditionTopBottom().

◆ createBHEInflowDirichletBoundaryCondition()

template<typename BHEUpdateCallback >
std::unique_ptr< BHEInflowDirichletBoundaryCondition< BHEUpdateCallback > > ProcessLib::HeatTransportBHE::createBHEInflowDirichletBoundaryCondition ( std::pair< GlobalIndexType, GlobalIndexType > && in_out_global_indices,
BHEUpdateCallback bhe_update_callback )

Definition at line 50 of file BHEInflowDirichletBoundaryCondition.h.

53{
54 DBUG("Constructing BHEInflowDirichletBoundaryCondition.");
55
56 // In case of partitioned mesh the boundary could be empty, i.e. there is no
57 // boundary condition.
58#ifdef USE_PETSC
59 // For this special boundary condition the boundary condition is not empty
60 // if the global indices are non-negative.
61 if (in_out_global_indices.first < 0 && in_out_global_indices.second < 0)
62 {
63 return nullptr;
64 }
65 // If only one of the global indices (in or out) is negative the
66 // implementation is not valid.
67 if (in_out_global_indices.first < 0 || in_out_global_indices.second < 0)
68 {
70 "The partition cuts the BHE into two independent parts. This "
71 "behaviour is not implemented.");
72 }
73#endif // USE_PETSC
74
75 return std::make_unique<
76 BHEInflowDirichletBoundaryCondition<BHEUpdateCallback>>(
77 std::move(in_out_global_indices), bhe_update_callback);
78}

References DBUG(), and OGS_FATAL.

Referenced by ProcessLib::HeatTransportBHE::HeatTransportBHEProcess::createBHEBoundaryConditionTopBottom().

◆ createHeatTransportBHEProcess()

std::unique_ptr< Process > ProcessLib::HeatTransportBHE::createHeatTransportBHEProcess ( std::string const & name,
MeshLib::Mesh & mesh,
std::unique_ptr< ProcessLib::AbstractJacobianAssembler > && jacobian_assembler,
std::vector< ProcessVariable > const & variables,
std::vector< std::unique_ptr< ParameterLib::ParameterBase > > const & parameters,
unsigned const integration_order,
BaseLib::ConfigTree const & config,
std::map< std::string, std::unique_ptr< MathLib::PiecewiseLinearInterpolation > > const & curves,
std::map< int, std::shared_ptr< MaterialPropertyLib::Medium > > const & media )
Input File Parameter
prj__processes__process__type

Process Variables

Input File Parameter
prj__processes__process__HEAT_TRANSPORT_BHE__process_variables

Primary process variables as they appear in the global component vector:

Input File Parameter
prj__processes__process__HEAT_TRANSPORT_BHE__process_variables__process_variable

Process Parameters

Input File Parameter
prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers
Input File Parameter
prj__processes__process__HEAT_TRANSPORT_BHE__use_server_communication
Input File Parameter
prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger
Input File Parameter
prj__processes__process__HEAT_TRANSPORT_BHE__borehole_heat_exchangers__borehole_heat_exchanger__type

Python object computing BC values.

Definition at line 31 of file CreateHeatTransportBHEProcess.cpp.

43{
45 config.checkConfigParameter("type", "HEAT_TRANSPORT_BHE");
46
47 DBUG("Create HeatTransportBHE Process.");
48
50
52 auto const pv_config = config.getConfigSubtree("process_variables");
53 std::vector<std::vector<std::reference_wrapper<ProcessVariable>>>
54 process_variables;
55
56 // reading primary variables for each
57 // BHE----------------------------------------------------------
59 auto range =
61 pv_config.getConfigParameterList<std::string>("process_variable");
62 std::vector<std::reference_wrapper<ProcessVariable>> per_process_variables;
63
64 for (std::string const& pv_name : range)
65 {
66 if (pv_name != "temperature_soil" &&
67 pv_name.find("temperature_BHE") == std::string::npos)
68 {
70 "Found a process variable name '{}'. It should be "
71 "'temperature_soil' or 'temperature_BHE_X'",
72 pv_name);
73 }
74 auto variable = std::find_if(variables.cbegin(), variables.cend(),
75 [&pv_name](ProcessVariable const& v)
76 { return v.getName() == pv_name; });
77
78 if (variable == variables.end())
79 {
81 "Could not find process variable '{:s}' in the provided "
82 "variables list for config tag <{:s}>.",
83 pv_name, "process_variable");
84 }
85 DBUG("Found process variable '{:s}' for config tag <{:s}>.",
86 variable->getName(), "process_variable");
87
88 per_process_variables.emplace_back(
89 const_cast<ProcessVariable&>(*variable));
90 }
91 process_variables.push_back(std::move(per_process_variables));
92 // end of reading primary variables for each
93 // BHE----------------------------------------------------------
94
96 // reading BHE parameters --------------------------------------------------
97 std::vector<BHE::BHETypes> bhes;
98
99 auto const& bhe_configs =
101 config.getConfigSubtree("borehole_heat_exchangers");
102
103 auto const using_server_communication =
105 config.getConfigParameter<bool>("use_server_communication", false);
106
107 for (
108 auto const& bhe_config :
110 bhe_configs.getConfigSubtreeList("borehole_heat_exchanger"))
111 {
112 // read in the parameters
113 const std::string bhe_type =
115 bhe_config.getConfigParameter<std::string>("type");
116
117 if (bhe_type == "1U")
118 {
119 bhes.emplace_back(
120 BHE::createBHEUType<BHE::BHE_1U>(bhe_config, curves));
121 continue;
122 }
123
124 if (bhe_type == "CXA")
125 {
126 bhes.emplace_back(
127 BHE::createBHECoaxial<BHE::BHE_CXA>(bhe_config, curves));
128 continue;
129 }
130
131 if (bhe_type == "CXC")
132 {
133 bhes.emplace_back(
134 BHE::createBHECoaxial<BHE::BHE_CXC>(bhe_config, curves));
135 continue;
136 }
137
138 if (bhe_type == "2U")
139 {
140 bhes.emplace_back(
141 BHE::createBHEUType<BHE::BHE_2U>(bhe_config, curves));
142 continue;
143 }
144
145 if (bhe_type == "1P")
146 {
147 bhes.emplace_back(
148 BHE::createBHE1PType<BHE::BHE_1P>(bhe_config, curves));
149 continue;
150 }
151 OGS_FATAL("Unknown BHE type '{:s}'.", bhe_type);
152 }
153 // end of reading BHE parameters -------------------------------------------
154
155 auto media_map =
157
158 // find if bhe uses python boundary condition
159 auto const using_tespy =
160 visit([](auto const& bhe) { return bhe.use_python_bcs; }, bhes[0]);
161
163 BHEInflowPythonBoundaryConditionPythonSideInterface* py_object = nullptr;
164 // create a pythonBoundaryCondition object
165 if (using_tespy || using_server_communication)
166 {
167 // Evaluate Python code in scope of main module
168 pybind11::object scope =
169 pybind11::module::import("__main__").attr("__dict__");
170
171 if (!scope.contains("bc_bhe"))
172 OGS_FATAL(
173 "Function 'bc_bhe' is not defined in the python script file, "
174 "or there was no python script file specified.");
175
176 py_object =
177 scope["bc_bhe"]
178 .cast<BHEInflowPythonBoundaryConditionPythonSideInterface*>();
179
180 if (py_object == nullptr)
181 OGS_FATAL(
182 "Not able to access the correct bc pointer from python script "
183 "file specified.");
184
185 // create BHE network dataframe from Python
186 py_object->dataframe_network = py_object->initializeDataContainer();
187 if (!py_object->isOverriddenEssential())
188 {
189 DBUG(
190 "Method `initializeDataContainer' not overridden in Python "
191 "script.");
192 }
193 // clear ogs bc_node_id memory in dataframe
194 std::get<3>(py_object->dataframe_network).clear(); // ogs_bc_node_id
195
196 // here calls the tespyHydroSolver to get the pipe flow velocity in bhe
197 // network
198 /* for 2U type the flowrate initialization process below causes conflict
199 // replace the value in flow velocity Matrix _u
200 auto const tespy_flow_rate = std::get<4>(py_object->dataframe_network);
201 const std::size_t n_bhe = tespy_flow_rate.size();
202 if (bhes.size() != n_bhe)
203 OGS_FATAL(
204 "The number of BHEs defined in OGS and TESPy are not the "
205 "same!");
206
207 for (std::size_t idx_bhe = 0; idx_bhe < n_bhe; idx_bhe++)
208 {
209 // the flow_rate in OGS should be updated from the flow_rate
210 // computed by TESPy.
211 auto update_flow_rate = [&](auto& bhe) {
212 bhe.updateHeatTransferCoefficients(tespy_flow_rate[idx_bhe]);
213 };
214 visit(update_flow_rate, bhes[idx_bhe]);
215 }
216 */
217 }
218
219 HeatTransportBHEProcessData process_data(
220 std::move(media_map), std::move(bhes), py_object, using_tespy,
221 using_server_communication);
222
223 SecondaryVariableCollection secondary_variables;
224
225 ProcessLib::createSecondaryVariables(config, secondary_variables);
226
227 return std::make_unique<HeatTransportBHEProcess>(
228 std::move(name), mesh, std::move(jacobian_assembler), parameters,
229 integration_order, std::move(process_variables),
230 std::move(process_data), std::move(secondary_variables));
231}
MaterialSpatialDistributionMap createMaterialSpatialDistributionMap(std::map< int, std::shared_ptr< Medium > > const &media, MeshLib::Mesh const &mesh)
void createSecondaryVariables(BaseLib::ConfigTree const &config, SecondaryVariableCollection &secondary_variables)

References BaseLib::ConfigTree::checkConfigParameter(), MaterialPropertyLib::createMaterialSpatialDistributionMap(), ProcessLib::createSecondaryVariables(), DBUG(), BaseLib::ConfigTree::getConfigParameter(), BaseLib::ConfigTree::getConfigParameterList(), BaseLib::ConfigTree::getConfigSubtree(), and OGS_FATAL.

Referenced by ProjectData::parseProcesses().

◆ createLocalAssemblers()

template<template< typename > class LocalAssemblerSoilImplementation, template< typename, typename > class LocalAssemblerBHEImplementation, typename LocalAssemblerInterface , typename... ExtraCtorArgs>
void ProcessLib::HeatTransportBHE::createLocalAssemblers ( std::vector< MeshLib::Element * > const & mesh_elements,
NumLib::LocalToGlobalIndexMap const & dof_table,
std::vector< std::unique_ptr< LocalAssemblerInterface > > & local_assemblers,
NumLib::IntegrationOrder const integration_order,
ExtraCtorArgs &&... extra_ctor_args )

Creates local assemblers for each element of the given mesh.

Template Parameters
LocalAssemblerImplementationthe individual local assembler type
LocalAssemblerInterfacethe general local assembler interface
ExtraCtorArgstypes of additional constructor arguments. Those arguments will be passed to the constructor of LocalAssemblerImplementation.

The first two template parameters cannot be deduced from the arguments. Therefore they always have to be provided manually.

Definition at line 74 of file CreateLocalAssemblers.h.

80{
81 DBUG("Create local assemblers for the HeatTransportBHE process.");
82
83 detail::createLocalAssemblers<LocalAssemblerSoilImplementation,
84 LocalAssemblerBHEImplementation>(
85 dof_table, mesh_elements, local_assemblers, integration_order,
86 std::forward<ExtraCtorArgs>(extra_ctor_args)...);
87}

References DBUG().

Referenced by ProcessLib::HeatTransportBHE::HeatTransportBHEProcess::initializeConcreteProcess().

◆ getBHEDataInMesh()

BHEMeshData ProcessLib::HeatTransportBHE::getBHEDataInMesh ( MeshLib::Mesh const & mesh)

get data about fracture and matrix elements/nodes from a mesh

Parameters
meshA mesh which includes BHE elements, i.e. 1-dimensional elements. It is assumed that elements forming a BHE have a distinct material ID.

Definition at line 51 of file MeshUtils.cpp.

52{
53 std::vector<MeshLib::Element*> const all_bhe_elements =
54 extractOneDimensionalElements(mesh.getElements());
55
56 // finally counting two types of elements
57 // They are (i) soil, and (ii) BHE type of elements
58 DBUG("-> found total {:d} soil elements and {:d} BHE elements",
59 mesh.getNumberOfElements() - all_bhe_elements.size(),
60 all_bhe_elements.size());
61
62 // get BHE material IDs
63 auto const* const opt_material_ids = MeshLib::materialIDs(mesh);
64 if (opt_material_ids == nullptr)
65 {
66 OGS_FATAL("Not able to get material IDs! ");
67 }
68 auto const& material_ids = *opt_material_ids;
69
70 auto const& bhe_material_ids =
71 getUniqueMaterialIds(material_ids, all_bhe_elements);
72 DBUG("-> found {:d} BHE material groups", bhe_material_ids.size());
73
74 // create a vector of BHE elements for each group
75 std::vector<std::vector<MeshLib::Element*>> bhe_elements;
76 bhe_elements.resize(bhe_material_ids.size());
77 for (unsigned bhe_id = 0; bhe_id < bhe_material_ids.size(); bhe_id++)
78 {
79 const auto bhe_mat_id = bhe_material_ids[bhe_id];
80 std::vector<MeshLib::Element*>& vec_elements = bhe_elements[bhe_id];
81 copy_if(begin(all_bhe_elements), end(all_bhe_elements),
82 back_inserter(vec_elements),
83 [&](MeshLib::Element const* const e)
84 { return material_ids[e->getID()] == bhe_mat_id; });
85 DBUG("-> found {:d} elements on the BHE_{:d}", vec_elements.size(),
86 bhe_id);
87 }
88
89 // get a vector of BHE nodes
90 std::vector<std::vector<MeshLib::Node*>> bhe_nodes;
91 bhe_nodes.resize(bhe_material_ids.size());
92 for (unsigned bhe_id = 0; bhe_id < bhe_material_ids.size(); bhe_id++)
93 {
94 std::vector<MeshLib::Node*>& vec_nodes = bhe_nodes[bhe_id];
95 for (MeshLib::Element* e : bhe_elements[bhe_id])
96 {
97 for (unsigned i = 0; i < e->getNumberOfNodes(); i++)
98 {
99 vec_nodes.push_back(const_cast<MeshLib::Node*>(e->getNode(i)));
100 }
101 }
103 MeshLib::idsComparator<MeshLib::Node*>);
104
105 DBUG("-> found {:d} nodes on the BHE_{:d}", vec_nodes.size(), bhe_id);
106 }
107
108 return {bhe_material_ids, bhe_elements, bhe_nodes};
109}
virtual unsigned getNumberOfNodes() const =0
virtual const Node * getNode(unsigned idx) const =0
std::size_t getID() const
Returns the ID of the element.
Definition Element.h:89
void makeVectorUnique(std::vector< T > &v)
Definition Algorithm.h:176
PropertyVector< int > const * materialIDs(Mesh const &mesh)
Definition Mesh.cpp:268
std::vector< int > getUniqueMaterialIds(std::vector< int > const &material_ids, std::vector< MeshLib::Element * > const &elements)
Definition MeshUtils.cpp:34
std::vector< MeshLib::Element * > extractOneDimensionalElements(std::vector< MeshLib::Element * > const &elements)
Definition MeshUtils.cpp:22

References DBUG(), MeshLib::Mesh::getElements(), MeshLib::Element::getID(), MeshLib::Mesh::getNumberOfElements(), BaseLib::makeVectorUnique(), MeshLib::materialIDs(), and OGS_FATAL.