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 ProcessLib
16{
17namespace HeatTransportBHE
18{
19namespace BHE
20{
34class BHE_2U final : public BHECommonUType
35{
36public:
37 BHE_2U(BoreholeGeometry const& borehole,
41 PipeConfigurationUType const& pipes,
42 bool const use_python_bcs);
43
44 static constexpr int number_of_unknowns = 8;
45 static constexpr int number_of_grout_zones = 4;
46
47 std::array<double, number_of_unknowns> pipeHeatCapacities() const;
48
49 std::array<double, number_of_unknowns> pipeHeatConductions() const;
50
51 std::array<Eigen::Vector3d, number_of_unknowns> pipeAdvectionVectors(
52 Eigen::Vector3d const& /*elem_direction*/) const;
53
54 template <int NPoints,
55 typename SingleUnknownMatrixType,
56 typename RMatrixType,
57 typename RPiSMatrixType,
58 typename RSMatrixType>
59 static void assembleRMatrices(
60 int const idx_bhe_unknowns,
61 Eigen::MatrixBase<SingleUnknownMatrixType> const& matBHE_loc_R,
62 Eigen::MatrixBase<RMatrixType>& R_matrix,
63 Eigen::MatrixBase<RPiSMatrixType>& R_pi_s_matrix,
64 Eigen::MatrixBase<RSMatrixType>& R_s_matrix)
65 {
66 switch (idx_bhe_unknowns)
67 {
68 case 0: // PHI_fig
69 R_matrix.block(0, 4 * NPoints, NPoints, NPoints) +=
70 -1.0 * matBHE_loc_R;
71 R_matrix.block(4 * NPoints, 0, NPoints, NPoints) +=
72 -1.0 * matBHE_loc_R; // R_i1
73
74 R_matrix.block(2, 5 * NPoints, NPoints, NPoints) +=
75 -1.0 * matBHE_loc_R;
76 R_matrix.block(5 * NPoints, 2, NPoints, NPoints) +=
77 -1.0 * matBHE_loc_R; // R_i2
78
79 R_matrix.block(0, 0, NPoints, NPoints) +=
80 1.0 * matBHE_loc_R; // K_i1
81 R_matrix.block(NPoints, NPoints, NPoints, NPoints) +=
82 1.0 * matBHE_loc_R; // K_i2
83 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
84 1.0 * matBHE_loc_R;
85 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
86 1.0 * matBHE_loc_R; // K_ig
87 return;
88 case 1: // PHI_fog
89 R_matrix.block(2 * NPoints, 6 * NPoints, NPoints, NPoints) +=
90 -1.0 * matBHE_loc_R;
91 R_matrix.block(6 * NPoints, 2 * NPoints, NPoints, NPoints) +=
92 -1.0 * matBHE_loc_R; // R_o1
93 R_matrix.block(3 * NPoints, 7 * NPoints, NPoints, NPoints) +=
94 -1.0 * matBHE_loc_R;
95 R_matrix.block(7 * NPoints, 3 * NPoints, NPoints, NPoints) +=
96 -1.0 * matBHE_loc_R; // R_o2
97
98 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
99 1.0 * matBHE_loc_R; // K_o1
100 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
101 1.0 * matBHE_loc_R; // K_o2
102 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
103 1.0 * matBHE_loc_R;
104 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
105 1.0 * matBHE_loc_R; // K_og
106 return;
107 case 2: // PHI_gg_1
108 R_matrix.block(4 * NPoints, 6 * NPoints, NPoints, NPoints) +=
109 -1.0 * matBHE_loc_R;
110 R_matrix.block(6 * NPoints, 4 * NPoints, NPoints, NPoints) +=
111 -1.0 * matBHE_loc_R;
112 R_matrix.block(4 * NPoints, 7 * NPoints, NPoints, NPoints) +=
113 -1.0 * matBHE_loc_R;
114 R_matrix.block(7 * NPoints, 4 * NPoints, NPoints, NPoints) +=
115 -1.0 * matBHE_loc_R;
116 R_matrix.block(5 * NPoints, 6 * NPoints, NPoints, NPoints) +=
117 -1.0 * matBHE_loc_R;
118 R_matrix.block(6 * NPoints, 5 * NPoints, NPoints, NPoints) +=
119 -1.0 * matBHE_loc_R;
120 R_matrix.block(5 * NPoints, 7 * NPoints, NPoints, NPoints) +=
121 -1.0 * matBHE_loc_R;
122 R_matrix.block(7 * NPoints, 5 * NPoints, NPoints, NPoints) +=
123 -1.0 * matBHE_loc_R; // R_g1
124
125 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
126 2.0 * matBHE_loc_R;
127 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
128 2.0 * matBHE_loc_R; // K_ig // notice we have two
129 // PHI_gg_1 term here.
130 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
131 2.0 * matBHE_loc_R;
132 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
133 2.0 * matBHE_loc_R; // K_og // see Diersch 2013 FEFLOW
134 // book page 954 Table M.2
135 return;
136 case 3: // PHI_gg_2
137 R_matrix.block(4 * NPoints, 5 * NPoints, NPoints, NPoints) +=
138 -1.0 * matBHE_loc_R;
139 R_matrix.block(5 * NPoints, 4 * NPoints, NPoints, NPoints) +=
140 -1.0 * matBHE_loc_R;
141 R_matrix.block(6 * NPoints, 7 * NPoints, NPoints, NPoints) +=
142 -1.0 * matBHE_loc_R;
143 R_matrix.block(7 * NPoints, 6 * NPoints, NPoints, NPoints) +=
144 -1.0 * matBHE_loc_R; // R_g2
145
146 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
147 1.0 * matBHE_loc_R;
148 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
149 1.0 * matBHE_loc_R; // K_ig // notice we only have
150 // 1 PHI_gg term here.
151 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
152 1.0 * matBHE_loc_R;
153 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
154 1.0 * matBHE_loc_R; // K_og // see Diersch 2013 FEFLOW
155 // book page 954 Table M.2
156 return;
157 case 4: // PHI_gs
158 R_s_matrix.template block<NPoints, NPoints>(0, 0).noalias() +=
159 1.0 * matBHE_loc_R;
160
161 R_pi_s_matrix.block(4 * NPoints, 0, NPoints, NPoints) +=
162 -1.0 * matBHE_loc_R;
163 R_pi_s_matrix.block(5 * NPoints, 0, NPoints, NPoints) +=
164 -1.0 * matBHE_loc_R;
165 R_pi_s_matrix.block(6 * NPoints, 0, NPoints, NPoints) +=
166 -1.0 * matBHE_loc_R;
167 R_pi_s_matrix.block(7 * NPoints, 0, NPoints, NPoints) +=
168 -1.0 * matBHE_loc_R;
169 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
170 1.0 * matBHE_loc_R;
171 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
172 1.0 * matBHE_loc_R; // K_ig
173 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
174 1.0 * matBHE_loc_R;
175 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
176 1.0 * matBHE_loc_R; // K_og
177 return;
178 default:
179 OGS_FATAL(
180 "Error!!! In the function BHE_2U::assembleRMatrices, "
181 "the index of bhe unknowns is out of range! ");
182 }
183 }
184
186 double updateFlowRateAndTemperature(double T_out, double current_time);
187
188 double thermalResistance(int const unknown_index) const
189 {
190 return _thermal_resistances[unknown_index];
191 }
192
193 static constexpr std::pair<int, int> inflow_outflow_bc_component_ids[] = {
194 {0, 2}, {1, 3}};
195
196 static std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>
198 std::size_t const top_node_id,
199 std::size_t const /*bottom_node_id*/,
200 int const in_component_id);
201
202 static std::optional<
203 std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>>
204 getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id,
205 int const in_component_id,
206 int const out_component_id);
207
208public:
209 std::array<double, number_of_unknowns> crossSectionAreas() const;
210
211 void updateHeatTransferCoefficients(double const flow_rate);
212
213private:
214 std::array<double, number_of_unknowns> calcThermalResistances(
215 double const Nu);
216
217private:
224 std::array<double, number_of_unknowns> _thermal_resistances;
225};
226} // namespace BHE
227} // namespace HeatTransportBHE
228} // namespace ProcessLib
#define OGS_FATAL(...)
Definition Error.h:19
BHECommonUType(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
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:257
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:59
std::array< double, number_of_unknowns > calcThermalResistances(double const Nu)
Nu is the Nusselt number.
Definition BHE_2U.cpp:186
static constexpr int number_of_unknowns
Definition BHE_2U.h:44
static constexpr std::pair< int, int > inflow_outflow_bc_component_ids[]
Definition BHE_2U.h:193
void updateHeatTransferCoefficients(double const flow_rate)
Definition BHE_2U.cpp:174
std::array< double, number_of_unknowns > _thermal_resistances
Definition BHE_2U.h:224
std::array< double, number_of_unknowns > pipeHeatConductions() const
Definition BHE_2U.cpp:58
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &) const
Definition BHE_2U.cpp:91
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
Definition BHE_2U.cpp:291
std::array< double, number_of_unknowns > pipeHeatCapacities() const
Definition BHE_2U.cpp:39
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:18
std::array< double, number_of_unknowns > crossSectionAreas() const
Definition BHE_2U.cpp:277
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:268
static constexpr int number_of_grout_zones
Definition BHE_2U.h:45
double thermalResistance(int const unknown_index) const
Definition BHE_2U.h:188
std::variant< TemperatureCurveConstantFlow, TemperatureCurveFlowCurve, FixedPowerConstantFlow, FixedPowerFlowCurve, PowerCurveConstantFlow, PowerCurveFlowCurve, BuildingPowerCurveConstantFlow, BuildingPowerCurveHotWaterCurveActiveCoolingCurveFlowCurve, BuildingPowerCurveHotWaterCurvePassiveCoolingCurveFlowCurve, BuildingPowerCurveHotWaterCurveFlowCurve, BuildingPowerCurveActiveCoolingCurveFlowCurve, BuildingPowerCurvePassiveCoolingCurveFlowCurve, BuildingPowerCurveFlowCurve, ActiveCoolingCurveFlowCurve > FlowAndTemperatureControl
RefrigerantProperties const refrigerant
Definition BHECommon.h:36
FlowAndTemperatureControl const flowAndTemperatureControl
Definition BHECommon.h:38