Line data Source code
1 : // EnergyPlus, Copyright (c) 1996-2024, The Board of Trustees of the University of Illinois, 2 : // The Regents of the University of California, through Lawrence Berkeley National Laboratory 3 : // (subject to receipt of any required approvals from the U.S. Dept. of Energy), Oak Ridge 4 : // National Laboratory, managed by UT-Battelle, Alliance for Sustainable Energy, LLC, and other 5 : // contributors. All rights reserved. 6 : // 7 : // NOTICE: This Software was developed under funding from the U.S. Department of Energy and the 8 : // U.S. Government consequently retains certain rights. As such, the U.S. Government has been 9 : // granted for itself and others acting on its behalf a paid-up, nonexclusive, irrevocable, 10 : // worldwide license in the Software to reproduce, distribute copies to the public, prepare 11 : // derivative works, and perform publicly and display publicly, and to permit others to do so. 12 : // 13 : // Redistribution and use in source and binary forms, with or without modification, are permitted 14 : // provided that the following conditions are met: 15 : // 16 : // (1) Redistributions of source code must retain the above copyright notice, this list of 17 : // conditions and the following disclaimer. 18 : // 19 : // (2) Redistributions in binary form must reproduce the above copyright notice, this list of 20 : // conditions and the following disclaimer in the documentation and/or other materials 21 : // provided with the distribution. 22 : // 23 : // (3) Neither the name of the University of California, Lawrence Berkeley National Laboratory, 24 : // the University of Illinois, U.S. Dept. of Energy nor the names of its contributors may be 25 : // used to endorse or promote products derived from this software without specific prior 26 : // written permission. 27 : // 28 : // (4) Use of EnergyPlus(TM) Name. If Licensee (i) distributes the software in stand-alone form 29 : // without changes from the version obtained under this License, or (ii) Licensee makes a 30 : // reference solely to the software portion of its product, Licensee must refer to the 31 : // software as "EnergyPlus version X" software, where "X" is the version number Licensee 32 : // obtained under this License and may not use a different name for the software. Except as 33 : // specifically required in this Section (4), Licensee shall not use in a company name, a 34 : // product name, in advertising, publicity, or other promotional activities any name, trade 35 : // name, trademark, logo, or other designation of "EnergyPlus", "E+", "e+" or confusingly 36 : // similar designation, without the U.S. Department of Energy's prior written consent. 37 : // 38 : // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR 39 : // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 40 : // AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 41 : // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 42 : // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 43 : // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 44 : // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 45 : // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 46 : // POSSIBILITY OF SUCH DAMAGE. 47 : 48 : #ifndef EarthTube_hh_INCLUDED 49 : #define EarthTube_hh_INCLUDED 50 : 51 : // ObjexxFCL Headers 52 : #include <ObjexxFCL/Array1D.hh> 53 : 54 : // EnergyPlus Headers 55 : #include <EnergyPlus/Data/BaseData.hh> 56 : #include <EnergyPlus/DataGlobals.hh> 57 : #include <EnergyPlus/EnergyPlus.hh> 58 : 59 : namespace EnergyPlus { 60 : 61 : // Forward declarations 62 : struct EnergyPlusData; 63 : 64 : namespace EarthTube { 65 : 66 : // Parameters for Ventilation 67 : enum class Ventilation 68 : { 69 : Invalid = -1, 70 : Natural, 71 : Intake, 72 : Exhaust, 73 : Num 74 : }; 75 : 76 : enum class EarthTubeModelType 77 : { 78 : Invalid = -1, 79 : Basic, 80 : Vertical, 81 : Num 82 : }; 83 : 84 : struct EarthTubeData 85 : { 86 : int ZonePtr = 0; 87 : int SchedPtr = 0; 88 : Real64 DesignLevel = 0.0; 89 : Real64 MinTemperature = 0.0; 90 : Real64 MaxTemperature = 0.0; 91 : Real64 DelTemperature = 0.0; 92 : Ventilation FanType = Ventilation::Invalid; 93 : Real64 FanPressure = 0.0; 94 : Real64 FanEfficiency = 0.0; 95 : Real64 FanPower = 0.0; 96 : Real64 GroundTempt = 0.0; // ground temp at the depth of the earth tube midpoint at time t 97 : Real64 InsideAirTemp = 0.0; 98 : Real64 AirTemp = 0.0; 99 : Real64 HumRat = 0.0; // Humidity ratio of air leaving EarthTube and entering zone 100 : Real64 WetBulbTemp = 0.0; // Humidity ratio of air leaving EarthTube and entering zone 101 : Real64 r1 = 0.0; // Inner Pipe Radius (m) 102 : Real64 r2 = 0.0; // Pipe Thickness (m) 103 : Real64 r3 = 0.0; // Distance between Pipe Outer Surface and Undistubed Soil (m) 104 : Real64 PipeLength = 0.0; // Entire Pipe Length 105 : Real64 PipeThermCond = 0.0; // Pipe Thermal Conductivity 106 : Real64 z = 0.0; // Depth under the Ground Surface (m) 107 : Real64 SoilThermDiff = 0.0; // Soil Thermal Diffusivity 108 : Real64 SoilThermCond = 0.0; // Soil Thermal Conductivity 109 : Real64 AverSoilSurTemp = 0.0; // Average Soil Surface Temperature 110 : Real64 ApmlSoilSurTemp = 0.0; // Amplitude of Soil Surface Temperature 111 : int SoilSurPhaseConst = 0; // Phase constant of Soil Surface 112 : Real64 ConstantTermCoef = 0.0; 113 : Real64 TemperatureTermCoef = 0.0; 114 : Real64 VelocityTermCoef = 0.0; 115 : Real64 VelocitySQTermCoef = 0.0; 116 : EarthTubeModelType ModelType = EarthTubeModelType::Basic; // Type of modeling technique: Basic or Vertical 117 : int vertParametersPtr = 0; // Pointer to EarthTubeParameters structure 118 : int totNodes = 0; // Total number of nodes in Vertical solution (nodes above + nodes below + 1 for earth tube itself) 119 : std::vector<Real64> aCoeff; // Verticel solution: original a-coefficients of the main A matrix (tridiagonal--coefficient before the diagonal) 120 : std::vector<Real64> bCoeff; // Verticel solution: original b-coefficients of the main A matrix (tridiagonal--coefficient on the diagonal) 121 : std::vector<Real64> cCoeff; // Verticel solution: original c-coefficients of the main A matrix (tridiagonal--coefficient after the diagonal) 122 : std::vector<Real64> cCoeff0; // Verticel solution: original c-coefficients of the main A matrix (tridiagonal--coefficient after the diagonal) 123 : // when effectiveness is zero 124 : std::vector<Real64> dCoeff; // Vertical solution: original coefficients of the b matrix (in Ax = b) 125 : std::vector<Real64> cPrime; // c' of the forward sweep in the Thomas Algorithm for solving a triagonal matrix 126 : std::vector<Real64> dPrime; // d' of the forward sweep in the Thomas Algorithm for solving a triagonal matrix 127 : std::vector<Real64> 128 : cPrime0; // c' of the forward sweep in the Thomas Algorithm for solving a triagonal matrix when effectiveness is zero (no flow) 129 : std::vector<Real64> tCurrent; // Current time step nodal temperatures 130 : std::vector<Real64> tLast; // Last time step nodal temperatures 131 : std::vector<Real64> depthNode; // depth of the node 132 : Real64 dMult0 = 0.0; // multiplier for term in equation to determine dCoeff at top node 133 : Real64 dMultN = 0.0; // multiplier for term in equation to determine dCoeff at bottom node 134 : Real64 depthUpperBound = 0.0; // depth at the upper boundary of the solution space for the vertical solution 135 : Real64 depthLowerBound = 0.0; // depth at the lower boundary of the solution space for the vertical solution 136 : std::vector<Real64> tUndist; // temperature of undisturbed soil at the depths of the modes 137 : Real64 tUpperBound = 0.0; // temperature of undisturbed soil at the upper boundary 138 : Real64 tLowerBound = 0.0; // temperature of undisturbed soil at the lower boundary 139 : Real64 airFlowCoeff = 0.0; // constant portion of the air flow term that gets added to the bCoeff and dCoeff vectors at the earth tube node 140 : 141 : void initCPrime0(); // initialize c' for when effectiveness is zero 142 : 143 : Real64 calcUndisturbedGroundTemperature(EnergyPlusData &state, Real64 depth); // depth at which temperature is to be calculated 144 : 145 : void calcVerticalEarthTube(EnergyPlusData &state, Real64 airFlowTerm); // constant portion of term that accounts for air flow in earth tube 146 : 147 : void CalcEarthTubeHumRat(EnergyPlusData &state, int NZ); // Zone number (index) 148 : }; 149 : 150 : struct EarthTubeZoneReportVars 151 : { 152 : // Members 153 : Real64 EarthTubeHeatLoss = 0.0; // [J] Heat loss or cooling to zone from air delivered by earth tube 154 : Real64 EarthTubeHeatLossRate = 0.0; // [W] Heat loss or cooling rate to zone from air delivered by earth tube 155 : Real64 EarthTubeHeatGain = 0.0; // [J] Heat Gain to zone from air delivered by earth tube 156 : Real64 EarthTubeHeatGainRate = 0.0; // [W] Heat Gain rate to zone from air delivered by earth tube 157 : Real64 EarthTubeOATreatmentPower = 0.0; // [W] rate of heat transfer to/from air. positive is heating OA to higher temp 158 : Real64 EarthTubeVolume = 0.0; // Volume of Air {m3} due to EarthTube 159 : Real64 EarthTubeVolFlowRate = 0.0; // Volume flow rate of air (m3/s) due to EarthTube 160 : Real64 EarthTubeVolFlowRateStd = 0.0; // Volume flow rate of air (m3/s) due to EarthTube at standard air conditions 161 : Real64 EarthTubeMass = 0.0; // Mass of Air {kg} due to EarthTube 162 : Real64 EarthTubeMassFlowRate = 0.0; // Mass flow rate of air (kg/s) due to EarthTube 163 : Real64 EarthTubeWaterMassFlowRate = 0.0; // Mass flow rate of water vapor (kg/s) due to EarthTube 164 : Real64 EarthTubeFanElec = 0.0; // [J] Fan Electricity consumed by EarthTube 165 : Real64 EarthTubeFanElecPower = 0.0; // [W] Fan Electric power for EarthTube 166 : Real64 EarthTubeAirTemp = 0.0; // Air Temp {C} of EarthTube, air leaving tube and entering zone 167 : Real64 EarthTubeWetBulbTemp = 0.0; // Wet Bulb Temperature {C} of EarthTube, air leaving tube and entering zone 168 : Real64 EarthTubeHumRat = 0.0; // Humidity Ratio {kg/kg} of EarthTube, air leaving tube and entering zone 169 : }; 170 : 171 : struct EarthTubeParameters 172 : { 173 : std::string nameParameters; // Name of the parameters (referenced by earth tube object) 174 : int numNodesAbove; // Number of nodes above the earth tube (converted from integer in input) 175 : int numNodesBelow; // Number of nodes below the earth tube (converted from integer in input) 176 : Real64 dimBoundAbove; // Dimensionless location of upper boundary of solution space (multiplied by earth tube depth - radius) 177 : Real64 dimBoundBelow; // Dimensionless location of lower boundary of solution space (multiplied by earth tube depth - radius) 178 : Real64 width; // Dimensionless width of solution space (multiplied by earth tube radius) 179 : }; 180 : 181 : void ManageEarthTube(EnergyPlusData &state); 182 : 183 : void GetEarthTube(EnergyPlusData &state, bool &ErrorsFound); // If errors found in input 184 : 185 : void CheckEarthTubesInZones(EnergyPlusData &state, 186 : std::string const &ZoneName, // name of zone for error reporting 187 : std::string_view FieldName, // name of earth tube in input 188 : bool &ErrorsFound // Found a problem 189 : ); 190 : 191 : void initEarthTubeVertical(EnergyPlusData &state); 192 : 193 : void CalcEarthTube(EnergyPlusData &state); 194 : 195 : void ReportEarthTube(EnergyPlusData &state); 196 : 197 : } // namespace EarthTube 198 : 199 : struct EarthTubeData : BaseGlobalStruct 200 : { 201 : bool GetInputFlag = true; 202 : bool initFirstTime = true; 203 : Real64 timeElapsed = 204 : 0.0; // keeps track so that certain initializations only happen once even if earth tubes are called multiple times per time step 205 : EPVector<EarthTube::EarthTubeData> EarthTubeSys; 206 : EPVector<EarthTube::EarthTubeZoneReportVars> ZnRptET; 207 : EPVector<EarthTube::EarthTubeParameters> EarthTubePars; 208 : 209 796 : void init_state([[maybe_unused]] EnergyPlusData &state) override 210 : { 211 796 : } 212 : 213 0 : void clear_state() override 214 : { 215 0 : new (this) EarthTubeData(); 216 0 : } 217 : }; 218 : 219 : } // namespace EnergyPlus 220 : 221 : #endif