OGS
BHE_2U.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) OpenGeoSys Community (opengeosys.org)
2// SPDX-License-Identifier: BSD-3-Clause
3
4#pragma once
5
6#include <Eigen/Core>
7#include <optional>
8
9#include "BHECommon.h"
10#include "BHECommonUType.h"
11#include "BaseLib/Error.h"
14
15namespace ParameterLib
16{
17class SpatialPosition;
18}
19
20namespace ProcessLib
21{
22namespace HeatTransportBHE
23{
24namespace BHE
25{
39class BHE_2U final : public BHECommonUType
40{
41public:
42 BHE_2U(BoreholeGeometry const& borehole,
46 PipeConfigurationUType const& pipes,
47 bool const use_python_bcs);
48
49 static constexpr int number_of_unknowns = 8;
50 static constexpr int number_of_grout_zones = 4;
51 static constexpr int number_of_flow_legs = 4;
52
56 std::array<double, number_of_flow_legs> flowLegs() const
57 {
59 }
60
61 std::array<double, number_of_unknowns> pipeHeatCapacities() const;
62
63 std::array<double, number_of_unknowns> pipeHeatConductions() const;
64
65 std::array<Eigen::Vector3d, number_of_unknowns> pipeAdvectionVectors(
66 Eigen::Vector3d const& elem_direction) const;
67
72 std::vector<double> thermalResistances(
73 ParameterLib::SpatialPosition const& pos) const;
74
75 template <int NPoints,
76 typename SingleUnknownMatrixType,
77 typename RMatrixType,
78 typename RPiSMatrixType,
79 typename RSMatrixType>
80 static void assembleRMatrices(
81 int const idx_bhe_unknowns,
82 Eigen::MatrixBase<SingleUnknownMatrixType> const& matBHE_loc_R,
83 Eigen::MatrixBase<RMatrixType>& R_matrix,
84 Eigen::MatrixBase<RPiSMatrixType>& R_pi_s_matrix,
85 Eigen::MatrixBase<RSMatrixType>& R_s_matrix)
86 {
87 switch (idx_bhe_unknowns)
88 {
89 case 0: // PHI_fig
90 R_matrix.block(0, 4 * NPoints, NPoints, NPoints) +=
91 -1.0 * matBHE_loc_R;
92 R_matrix.block(4 * NPoints, 0, NPoints, NPoints) +=
93 -1.0 * matBHE_loc_R; // R_i1
94
95 R_matrix.block(2, 5 * NPoints, NPoints, NPoints) +=
96 -1.0 * matBHE_loc_R;
97 R_matrix.block(5 * NPoints, 2, NPoints, NPoints) +=
98 -1.0 * matBHE_loc_R; // R_i2
99
100 R_matrix.block(0, 0, NPoints, NPoints) +=
101 1.0 * matBHE_loc_R; // K_i1
102 R_matrix.block(NPoints, NPoints, NPoints, NPoints) +=
103 1.0 * matBHE_loc_R; // K_i2
104 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
105 1.0 * matBHE_loc_R;
106 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
107 1.0 * matBHE_loc_R; // K_ig
108 return;
109 case 1: // PHI_fog
110 R_matrix.block(2 * NPoints, 6 * NPoints, NPoints, NPoints) +=
111 -1.0 * matBHE_loc_R;
112 R_matrix.block(6 * NPoints, 2 * NPoints, NPoints, NPoints) +=
113 -1.0 * matBHE_loc_R; // R_o1
114 R_matrix.block(3 * NPoints, 7 * NPoints, NPoints, NPoints) +=
115 -1.0 * matBHE_loc_R;
116 R_matrix.block(7 * NPoints, 3 * NPoints, NPoints, NPoints) +=
117 -1.0 * matBHE_loc_R; // R_o2
118
119 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
120 1.0 * matBHE_loc_R; // K_o1
121 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
122 1.0 * matBHE_loc_R; // K_o2
123 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
124 1.0 * matBHE_loc_R;
125 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
126 1.0 * matBHE_loc_R; // K_og
127 return;
128 case 2: // PHI_gg_1
129 R_matrix.block(4 * NPoints, 6 * NPoints, NPoints, NPoints) +=
130 -1.0 * matBHE_loc_R;
131 R_matrix.block(6 * NPoints, 4 * NPoints, NPoints, NPoints) +=
132 -1.0 * matBHE_loc_R;
133 R_matrix.block(4 * NPoints, 7 * NPoints, NPoints, NPoints) +=
134 -1.0 * matBHE_loc_R;
135 R_matrix.block(7 * NPoints, 4 * NPoints, NPoints, NPoints) +=
136 -1.0 * matBHE_loc_R;
137 R_matrix.block(5 * NPoints, 6 * NPoints, NPoints, NPoints) +=
138 -1.0 * matBHE_loc_R;
139 R_matrix.block(6 * NPoints, 5 * NPoints, NPoints, NPoints) +=
140 -1.0 * matBHE_loc_R;
141 R_matrix.block(5 * NPoints, 7 * NPoints, NPoints, NPoints) +=
142 -1.0 * matBHE_loc_R;
143 R_matrix.block(7 * NPoints, 5 * NPoints, NPoints, NPoints) +=
144 -1.0 * matBHE_loc_R; // R_g1
145
146 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
147 2.0 * matBHE_loc_R;
148 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
149 2.0 * matBHE_loc_R; // K_ig
150 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
151 2.0 * matBHE_loc_R;
152 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
153 2.0 * matBHE_loc_R; // K_og
154 return;
155 case 3: // PHI_gg_2
156 R_matrix.block(4 * NPoints, 5 * NPoints, NPoints, NPoints) +=
157 -1.0 * matBHE_loc_R;
158 R_matrix.block(5 * NPoints, 4 * NPoints, NPoints, NPoints) +=
159 -1.0 * matBHE_loc_R;
160 R_matrix.block(6 * NPoints, 7 * NPoints, NPoints, NPoints) +=
161 -1.0 * matBHE_loc_R;
162 R_matrix.block(7 * NPoints, 6 * NPoints, NPoints, NPoints) +=
163 -1.0 * matBHE_loc_R; // R_g2
164
165 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
166 1.0 * matBHE_loc_R;
167 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
168 1.0 * matBHE_loc_R; // K_ig
169 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
170 1.0 * matBHE_loc_R;
171 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
172 1.0 * matBHE_loc_R; // K_og
173 return;
174 case 4: // PHI_gs
175 R_s_matrix.template block<NPoints, NPoints>(0, 0).noalias() +=
176 1.0 * matBHE_loc_R;
177
178 R_pi_s_matrix.block(4 * NPoints, 0, NPoints, NPoints) +=
179 -1.0 * matBHE_loc_R;
180 R_pi_s_matrix.block(5 * NPoints, 0, NPoints, NPoints) +=
181 -1.0 * matBHE_loc_R;
182 R_pi_s_matrix.block(6 * NPoints, 0, NPoints, NPoints) +=
183 -1.0 * matBHE_loc_R;
184 R_pi_s_matrix.block(7 * NPoints, 0, NPoints, NPoints) +=
185 -1.0 * matBHE_loc_R;
186 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
187 1.0 * matBHE_loc_R;
188 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
189 1.0 * matBHE_loc_R; // K_ig
190 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
191 1.0 * matBHE_loc_R;
192 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
193 1.0 * matBHE_loc_R; // K_og
194 return;
195 default:
196 OGS_FATAL(
197 "BHE_2U::assembleRMatrices: unknown index {:d} "
198 "out of range.",
199 idx_bhe_unknowns);
200 }
201 }
202
204 double updateFlowRateAndTemperature(double T_out, double current_time);
205
206 static constexpr std::pair<int, int> inflow_outflow_bc_component_ids[] = {
207 {0, 2}, {1, 3}};
208
209 static std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>
211 std::size_t const top_node_id,
212 std::size_t const /*bottom_node_id*/,
213 int const in_component_id);
214
215 static std::optional<
216 std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>>
217 getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id,
218 int const in_component_id,
219 int const out_component_id);
220
221public:
222 std::array<double, number_of_unknowns> crossSectionAreas(
223 ParameterLib::SpatialPosition const& pos) const;
224
225 void updateHeatTransferCoefficients(double const flow_rate);
226
227private:
228 double cached_nu_ = 0.0;
229
230 std::vector<double> calcThermalResistances(
231 double const Nu, ParameterLib::SpatialPosition const& pos) const;
232};
233} // namespace BHE
234} // namespace HeatTransportBHE
235} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:10
BHECommonUType(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
RefrigerantProperties const refrigerant
Definition BHECommon.h:51
FlowAndTemperatureControl const flowAndTemperatureControl
Definition BHECommon.h:53
static std::array< std::pair< std::size_t, int >, 2 > getBHEInflowDirichletBCNodesAndComponents(std::size_t const top_node_id, std::size_t const, int const in_component_id)
Definition BHE_2U.cpp:250
std::array< double, number_of_flow_legs > flowLegs() const
Definition BHE_2U.h:56
static void assembleRMatrices(int const idx_bhe_unknowns, Eigen::MatrixBase< SingleUnknownMatrixType > const &matBHE_loc_R, Eigen::MatrixBase< RMatrixType > &R_matrix, Eigen::MatrixBase< RPiSMatrixType > &R_pi_s_matrix, Eigen::MatrixBase< RSMatrixType > &R_s_matrix)
Definition BHE_2U.h:80
static constexpr int number_of_unknowns
Definition BHE_2U.h:49
static constexpr std::pair< int, int > inflow_outflow_bc_component_ids[]
Definition BHE_2U.h:206
std::array< double, number_of_unknowns > crossSectionAreas(ParameterLib::SpatialPosition const &pos) const
Definition BHE_2U.cpp:269
void updateHeatTransferCoefficients(double const flow_rate)
Definition BHE_2U.cpp:140
std::array< double, number_of_unknowns > pipeHeatConductions() const
Definition BHE_2U.cpp:60
std::vector< double > calcThermalResistances(double const Nu, ParameterLib::SpatialPosition const &pos) const
Definition BHE_2U.cpp:155
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
Definition BHE_2U.cpp:293
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &elem_direction) const
Definition BHE_2U.cpp:86
std::array< double, number_of_unknowns > pipeHeatCapacities() const
Definition BHE_2U.cpp:41
BHE_2U(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
Definition BHE_2U.cpp:20
std::vector< double > thermalResistances(ParameterLib::SpatialPosition const &pos) const
Definition BHE_2U.cpp:149
static std::optional< std::array< std::pair< std::size_t, int >, 2 > > getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id, int const in_component_id, int const out_component_id)
Definition BHE_2U.cpp:260
static constexpr int number_of_grout_zones
Definition BHE_2U.h:50
static constexpr int number_of_flow_legs
Definition BHE_2U.h:51
std::variant< InflowTemperature, Power, BuildingPower, BuildingPowerHotWaterActiveCooling, BuildingPowerHotWaterPassiveCooling, BuildingPowerHotWater, BuildingPowerActiveCooling, BuildingPowerPassiveCooling, ActiveCooling > FlowAndTemperatureControl