OGS
BHE_1U.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_1U final : public BHECommonUType
35{
36public:
37 BHE_1U(BoreholeGeometry const& borehole,
41 PipeConfigurationUType const& pipes,
42 bool const use_python_bcs);
43
51
52 static constexpr int number_of_unknowns = 4;
53 static constexpr int number_of_grout_zones = 2;
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, 2 * NPoints, NPoints, NPoints) +=
80 -1.0 * matBHE_loc_R;
81 R_matrix.block(2 * NPoints, 0, NPoints, NPoints) +=
82 -1.0 * matBHE_loc_R;
83
84 R_matrix.block(0, 0, NPoints, NPoints) +=
85 1.0 * matBHE_loc_R; // K_i1
86 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
87 1.0 * matBHE_loc_R; // K_ig
88 return;
89 case 1: // PHI_fog
90 R_matrix.block(NPoints, 3 * NPoints, NPoints, NPoints) +=
91 -1.0 * matBHE_loc_R;
92 R_matrix.block(3 * NPoints, NPoints, NPoints, NPoints) +=
93 -1.0 * matBHE_loc_R;
94
95 R_matrix.block(NPoints, NPoints, NPoints, NPoints) +=
96 1.0 * matBHE_loc_R; // K_o1
97 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
98 1.0 * matBHE_loc_R; // K_og
99 return;
100 case 2: // PHI_gg
101 R_matrix.block(2 * NPoints, 3 * NPoints, NPoints, NPoints) +=
102 -1.0 * matBHE_loc_R;
103 R_matrix.block(3 * NPoints, 2 * NPoints, NPoints, NPoints) +=
104 -1.0 * matBHE_loc_R;
105
106 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
107 1.0 * matBHE_loc_R; // K_ig // notice we only have
108 // 1 PHI_gg term here.
109 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
110 1.0 * matBHE_loc_R; // K_og // see Diersch 2013 FEFLOW
111 // book page 954 Table M.2
112 return;
113 case 3: // PHI_gs
114 R_s_matrix.template block<NPoints, NPoints>(0, 0).noalias() +=
115 1.0 * matBHE_loc_R;
116
117 R_pi_s_matrix.block(2 * NPoints, 0, NPoints, NPoints) +=
118 -1.0 * matBHE_loc_R;
119 R_pi_s_matrix.block(3 * NPoints, 0, NPoints, NPoints) +=
120 -1.0 * matBHE_loc_R;
121 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
122 1.0 * matBHE_loc_R; // K_ig
123 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
124 1.0 * matBHE_loc_R; // K_og
125 return;
126 default:
127 OGS_FATAL(
128 "BHE_1U::assembleRMatrices: unknown index {:d} "
129 "out of range.",
130 idx_bhe_unknowns);
131 }
132 }
133
135 double updateFlowRateAndTemperature(double T_out, double current_time);
136
137 static constexpr std::pair<int, int> inflow_outflow_bc_component_ids[] = {
138 {0, 1}};
139
140 static std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>
142 std::size_t const top_node_id,
143 std::size_t const /*bottom_node_id*/,
144 int const in_component_id);
145 static std::optional<
146 std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>>
147 getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id,
148 int const in_component_id,
149 int const out_component_id);
150
151public:
152 std::array<double, number_of_unknowns> crossSectionAreas(
153 int const section_index = 0) const;
154
155 void updateHeatTransferCoefficients(double const flow_rate);
156
157private:
158 std::vector<double> calcThermalResistances(
159 double const Nu, int const section_index = 0) const;
160};
161} // namespace BHE
162} // namespace HeatTransportBHE
163} // 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 constexpr std::pair< int, int > inflow_outflow_bc_component_ids[]
Definition BHE_1U.h:137
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
Definition BHE_1U.cpp:235
std::array< double, number_of_unknowns > crossSectionAreas(int const section_index=0) const
Definition BHE_1U.cpp:222
std::vector< double > calcThermalResistances(double const Nu, int const section_index=0) const
Definition BHE_1U.cpp:148
static constexpr int number_of_unknowns
Definition BHE_1U.h:52
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_1U.h:69
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_1U.cpp:213
std::array< double, number_of_unknowns > pipeHeatConductions(int const section_index=0) const
Definition BHE_1U.cpp:53
static constexpr int number_of_grout_zones
Definition BHE_1U.h:53
void updateHeatTransferCoefficients(double const flow_rate)
Definition BHE_1U.cpp:133
BHE_1U(BoreholeGeometry const &borehole, RefrigerantProperties const &refrigerant, GroutParameters const &grout, FlowAndTemperatureControl const &flowAndTemperatureControl, PipeConfigurationUType const &pipes, bool const use_python_bcs)
Definition BHE_1U.cpp:18
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_1U.cpp:202
BHE_1U withGeometry(BoreholeGeometry const &g) const
Definition BHE_1U.h:46
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &, int const section_index=0) const
Definition BHE_1U.cpp:80
std::array< double, number_of_unknowns > pipeHeatCapacities() const
Definition BHE_1U.cpp:38
std::variant< InflowTemperature, Power, BuildingPower, BuildingPowerHotWaterActiveCooling, BuildingPowerHotWaterPassiveCooling, BuildingPowerHotWater, BuildingPowerActiveCooling, BuildingPowerPassiveCooling, ActiveCooling > FlowAndTemperatureControl