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
44 static constexpr int number_of_unknowns = 4;
45 static constexpr int number_of_grout_zones = 2;
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, 2 * NPoints, NPoints, NPoints) +=
70 -1.0 * matBHE_loc_R;
71 R_matrix.block(2 * NPoints, 0, NPoints, NPoints) +=
72 -1.0 * matBHE_loc_R;
73
74 R_matrix.block(0, 0, NPoints, NPoints) +=
75 1.0 * matBHE_loc_R; // K_i1
76 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
77 1.0 * matBHE_loc_R; // K_ig
78 return;
79 case 1: // PHI_fog
80 R_matrix.block(NPoints, 3 * NPoints, NPoints, NPoints) +=
81 -1.0 * matBHE_loc_R;
82 R_matrix.block(3 * NPoints, NPoints, NPoints, NPoints) +=
83 -1.0 * matBHE_loc_R;
84
85 R_matrix.block(NPoints, NPoints, NPoints, NPoints) +=
86 1.0 * matBHE_loc_R; // K_o1
87 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
88 1.0 * matBHE_loc_R; // K_og
89 return;
90 case 2: // PHI_gg
91 R_matrix.block(2 * NPoints, 3 * NPoints, NPoints, NPoints) +=
92 -1.0 * matBHE_loc_R;
93 R_matrix.block(3 * NPoints, 2 * NPoints, NPoints, NPoints) +=
94 -1.0 * matBHE_loc_R;
95
96 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
97 1.0 * matBHE_loc_R; // K_ig // notice we only have
98 // 1 PHI_gg term here.
99 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
100 1.0 * matBHE_loc_R; // K_og // see Diersch 2013 FEFLOW
101 // book page 954 Table M.2
102 return;
103 case 3: // PHI_gs
104 R_s_matrix.template block<NPoints, NPoints>(0, 0).noalias() +=
105 1.0 * matBHE_loc_R;
106
107 R_pi_s_matrix.block(2 * NPoints, 0, NPoints, NPoints) +=
108 -1.0 * matBHE_loc_R;
109 R_pi_s_matrix.block(3 * NPoints, 0, NPoints, NPoints) +=
110 -1.0 * matBHE_loc_R;
111 R_matrix.block(2 * NPoints, 2 * NPoints, NPoints, NPoints) +=
112 1.0 * matBHE_loc_R; // K_ig
113 R_matrix.block(3 * NPoints, 3 * NPoints, NPoints, NPoints) +=
114 1.0 * matBHE_loc_R; // K_og
115 return;
116 default:
117 OGS_FATAL(
118 "Error!!! In the function BHE_1U::assembleRMatrices, "
119 "the index of bhe unknowns is out of range! ");
120 }
121 }
122
124 double updateFlowRateAndTemperature(double T_out, double current_time);
125
126 double thermalResistance(int const unknown_index) const
127 {
128 return _thermal_resistances[unknown_index];
129 }
130
131 static constexpr std::pair<int, int> inflow_outflow_bc_component_ids[] = {
132 {0, 1}};
133
134 static std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>
136 std::size_t const top_node_id,
137 std::size_t const /*bottom_node_id*/,
138 int const in_component_id);
139 static std::optional<
140 std::array<std::pair<std::size_t /*node_id*/, int /*component*/>, 2>>
141 getBHEBottomDirichletBCNodesAndComponents(std::size_t const bottom_node_id,
142 int const in_component_id,
143 int const out_component_id);
144
145public:
146 std::array<double, number_of_unknowns> crossSectionAreas() const;
147
148 void updateHeatTransferCoefficients(double const flow_rate);
149
150private:
151 std::array<double, number_of_unknowns> calcThermalResistances(
152 double const Nu);
153
154private:
161 std::array<double, number_of_unknowns> _thermal_resistances;
162};
163} // namespace BHE
164} // namespace HeatTransportBHE
165} // 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 constexpr std::pair< int, int > inflow_outflow_bc_component_ids[]
Definition BHE_1U.h:131
std::array< Eigen::Vector3d, number_of_unknowns > pipeAdvectionVectors(Eigen::Vector3d const &) const
Definition BHE_1U.cpp:81
double updateFlowRateAndTemperature(double T_out, double current_time)
Return the inflow temperature for the boundary condition.
Definition BHE_1U.cpp:255
static constexpr int number_of_unknowns
Definition BHE_1U.h:44
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:59
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:239
std::array< double, number_of_unknowns > calcThermalResistances(double const Nu)
Nu is the Nusselt number.
Definition BHE_1U.cpp:166
std::array< double, number_of_unknowns > pipeHeatConductions() const
Definition BHE_1U.cpp:54
std::array< double, number_of_unknowns > _thermal_resistances
Definition BHE_1U.h:161
static constexpr int number_of_grout_zones
Definition BHE_1U.h:45
std::array< double, number_of_unknowns > crossSectionAreas() const
Definition BHE_1U.cpp:248
void updateHeatTransferCoefficients(double const flow_rate)
Definition BHE_1U.cpp:154
double thermalResistance(int const unknown_index) const
Definition BHE_1U.h:126
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:228
std::array< double, number_of_unknowns > pipeHeatCapacities() const
Definition BHE_1U.cpp:39
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