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
51
52 static constexpr int number_of_unknowns = 8;
53 static constexpr int number_of_grout_zones = 4;
54
55 std::array<double, number_of_unknowns> pipeHeatCapacities() const;
56
57 std::array<double, number_of_unknowns> pipeHeatConductions(
58 int const section_index = 0) const;
59
60 std::array<Eigen::Vector3d, number_of_unknowns> pipeAdvectionVectors(
61 Eigen::Vector3d const& /*elem_direction*/,
62 int const section_index = 0) const;
63
64 template <int NPoints,
65 typename SingleUnknownMatrixType,
66 typename RMatrixType,
67 typename RPiSMatrixType,
68 typename RSMatrixType>
69 static void assembleRMatrices(
70 int const idx_bhe_unknowns,
71 Eigen::MatrixBase<SingleUnknownMatrixType> const& matBHE_loc_R,
72 Eigen::MatrixBase<RMatrixType>& R_matrix,
73 Eigen::MatrixBase<RPiSMatrixType>& R_pi_s_matrix,
74 Eigen::MatrixBase<RSMatrixType>& R_s_matrix)
75 {
76 switch (idx_bhe_unknowns)
77 {
78 case 0: // PHI_fig
79 R_matrix.block(0, 4 * NPoints, NPoints, NPoints) +=
80 -1.0 * matBHE_loc_R;
81 R_matrix.block(4 * NPoints, 0, NPoints, NPoints) +=
82 -1.0 * matBHE_loc_R; // R_i1
83
84 R_matrix.block(2, 5 * NPoints, NPoints, NPoints) +=
85 -1.0 * matBHE_loc_R;
86 R_matrix.block(5 * NPoints, 2, NPoints, NPoints) +=
87 -1.0 * matBHE_loc_R; // R_i2
88
89 R_matrix.block(0, 0, NPoints, NPoints) +=
90 1.0 * matBHE_loc_R; // K_i1
91 R_matrix.block(NPoints, NPoints, NPoints, NPoints) +=
92 1.0 * matBHE_loc_R; // K_i2
93 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
94 1.0 * matBHE_loc_R;
95 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
96 1.0 * matBHE_loc_R; // K_ig
97 return;
98 case 1: // PHI_fog
99 R_matrix.block(2 * NPoints, 6 * NPoints, NPoints, NPoints) +=
100 -1.0 * matBHE_loc_R;
101 R_matrix.block(6 * NPoints, 2 * NPoints, NPoints, NPoints) +=
102 -1.0 * matBHE_loc_R; // R_o1
103 R_matrix.block(3 * NPoints, 7 * NPoints, NPoints, NPoints) +=
104 -1.0 * matBHE_loc_R;
105 R_matrix.block(7 * NPoints, 3 * NPoints, NPoints, NPoints) +=
106 -1.0 * matBHE_loc_R; // R_o2
107
108 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
109 1.0 * matBHE_loc_R; // K_o1
110 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
111 1.0 * matBHE_loc_R; // K_o2
112 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
113 1.0 * matBHE_loc_R;
114 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
115 1.0 * matBHE_loc_R; // K_og
116 return;
117 case 2: // PHI_gg_1
118 R_matrix.block(4 * NPoints, 6 * NPoints, NPoints, NPoints) +=
119 -1.0 * matBHE_loc_R;
120 R_matrix.block(6 * NPoints, 4 * NPoints, NPoints, NPoints) +=
121 -1.0 * matBHE_loc_R;
122 R_matrix.block(4 * NPoints, 7 * NPoints, NPoints, NPoints) +=
123 -1.0 * matBHE_loc_R;
124 R_matrix.block(7 * NPoints, 4 * NPoints, NPoints, NPoints) +=
125 -1.0 * matBHE_loc_R;
126 R_matrix.block(5 * NPoints, 6 * NPoints, NPoints, NPoints) +=
127 -1.0 * matBHE_loc_R;
128 R_matrix.block(6 * NPoints, 5 * NPoints, NPoints, NPoints) +=
129 -1.0 * matBHE_loc_R;
130 R_matrix.block(5 * NPoints, 7 * NPoints, NPoints, NPoints) +=
131 -1.0 * matBHE_loc_R;
132 R_matrix.block(7 * NPoints, 5 * NPoints, NPoints, NPoints) +=
133 -1.0 * matBHE_loc_R; // R_g1
134
135 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
136 2.0 * matBHE_loc_R;
137 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
138 2.0 * matBHE_loc_R; // K_ig // notice we have two
139 // PHI_gg_1 term here.
140 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
141 2.0 * matBHE_loc_R;
142 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
143 2.0 * matBHE_loc_R; // K_og // see Diersch 2013 FEFLOW
144 // book page 954 Table M.2
145 return;
146 case 3: // PHI_gg_2
147 R_matrix.block(4 * NPoints, 5 * NPoints, NPoints, NPoints) +=
148 -1.0 * matBHE_loc_R;
149 R_matrix.block(5 * NPoints, 4 * NPoints, NPoints, NPoints) +=
150 -1.0 * matBHE_loc_R;
151 R_matrix.block(6 * NPoints, 7 * NPoints, NPoints, NPoints) +=
152 -1.0 * matBHE_loc_R;
153 R_matrix.block(7 * NPoints, 6 * NPoints, NPoints, NPoints) +=
154 -1.0 * matBHE_loc_R; // R_g2
155
156 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
157 1.0 * matBHE_loc_R;
158 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
159 1.0 * matBHE_loc_R; // K_ig // notice we only have
160 // 1 PHI_gg term here.
161 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
162 1.0 * matBHE_loc_R;
163 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
164 1.0 * matBHE_loc_R; // K_og // see Diersch 2013 FEFLOW
165 // book page 954 Table M.2
166 return;
167 case 4: // PHI_gs
168 R_s_matrix.template block<NPoints, NPoints>(0, 0).noalias() +=
169 1.0 * matBHE_loc_R;
170
171 R_pi_s_matrix.block(4 * NPoints, 0, NPoints, NPoints) +=
172 -1.0 * matBHE_loc_R;
173 R_pi_s_matrix.block(5 * NPoints, 0, NPoints, NPoints) +=
174 -1.0 * matBHE_loc_R;
175 R_pi_s_matrix.block(6 * NPoints, 0, NPoints, NPoints) +=
176 -1.0 * matBHE_loc_R;
177 R_pi_s_matrix.block(7 * NPoints, 0, NPoints, NPoints) +=
178 -1.0 * matBHE_loc_R;
179 R_matrix.block(4 * NPoints, 4 * NPoints, NPoints, NPoints) +=
180 1.0 * matBHE_loc_R;
181 R_matrix.block(5 * NPoints, 5 * NPoints, NPoints, NPoints) +=
182 1.0 * matBHE_loc_R; // K_ig
183 R_matrix.block(6 * NPoints, 6 * NPoints, NPoints, NPoints) +=
184 1.0 * matBHE_loc_R;
185 R_matrix.block(7 * NPoints, 7 * NPoints, NPoints, NPoints) +=
186 1.0 * matBHE_loc_R; // K_og
187 return;
188 default:
189 OGS_FATAL(
190 "BHE_2U::assembleRMatrices: unknown index {:d} "
191 "out of range.",
192 idx_bhe_unknowns);
193 }
194 }
195
197 double updateFlowRateAndTemperature(double T_out, double current_time);
198
199 static constexpr std::pair<int, int> inflow_outflow_bc_component_ids[] = {
200 {0, 2}, {1, 3}};
201
202 static std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>
204 std::size_t const top_node_id,
205 std::size_t const /*bottom_node_id*/,
206 int const in_component_id);
207
208 static std::optional<
209 std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>>
210 getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id,
211 int const in_component_id,
212 int const out_component_id);
213
214public:
215 std::array<double, number_of_unknowns> crossSectionAreas(
216 int const section_index = 0) const;
217
218 void updateHeatTransferCoefficients(double const flow_rate);
219
220private:
221 std::vector<double> calcThermalResistances(
222 double const Nu, int const section_index = 0) const;
223};
224} // namespace BHE
225} // namespace HeatTransportBHE
226} // 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)
RefrigerantProperties const refrigerant
Definition BHECommon.h:72
FlowAndTemperatureControl const flowAndTemperatureControl
Definition BHECommon.h:74
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:225
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:69
static constexpr int number_of_unknowns
Definition BHE_2U.h:52
static constexpr std::pair< int, int > inflow_outflow_bc_component_ids[]
Definition BHE_2U.h:199
void updateHeatTransferCoefficients(double const flow_rate)
Definition BHE_2U.cpp:147
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
Definition BHE_2U.cpp:270
std::array< double, number_of_unknowns > pipeHeatCapacities() const
Definition BHE_2U.cpp:38
std::vector< double > calcThermalResistances(double const Nu, int const section_index=0) const
Definition BHE_2U.cpp:162
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(int const section_index=0) const
Definition BHE_2U.cpp:245
std::array< double, number_of_unknowns > pipeHeatConductions(int const section_index=0) const
Definition BHE_2U.cpp:57
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:236
static constexpr int number_of_grout_zones
Definition BHE_2U.h:53
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &, int const section_index=0) const
Definition BHE_2U.cpp:88
BHE_2U withGeometry(BoreholeGeometry const &g) const
Definition BHE_2U.h:46
std::variant< InflowTemperature, Power, BuildingPower, BuildingPowerHotWaterActiveCooling, BuildingPowerHotWaterPassiveCooling, BuildingPowerHotWater, BuildingPowerActiveCooling, BuildingPowerPassiveCooling, ActiveCooling > FlowAndTemperatureControl