LCOV - code coverage report
Current view: top level - EnergyPlus - HeatBalanceInternalHeatGains.cc (source / functions) Coverage Total Hit
Test: lcov.output.filtered Lines: 96.4 % 56 54
Test Date: 2025-05-22 16:09:37 Functions: 100.0 % 2 2

            Line data    Source code
       1              : // EnergyPlus, Copyright (c) 1996-2025, 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              : // ObjexxFCL Headers
      49              : #include <ObjexxFCL/Array1D.hh>
      50              : 
      51              : // EnergyPlus Headers
      52              : #include <EnergyPlus/Data/EnergyPlusData.hh>
      53              : #include <EnergyPlus/DataHeatBalance.hh>
      54              : #include <EnergyPlus/HeatBalanceInternalHeatGains.hh>
      55              : #include <EnergyPlus/UtilityRoutines.hh>
      56              : 
      57              : namespace EnergyPlus {
      58              : 
      59           73 : void SetupZoneInternalGain(EnergyPlusData &state,
      60              :                            int const ZoneNum,
      61              :                            std::string_view const cComponentName, // user unique name for device
      62              :                            DataHeatBalance::IntGainType const IntGainCompType,
      63              :                            Real64 *ConvectionGainRate, // pointer target for remote convection gain value to be accessed
      64              :                            Real64 *ReturnAirConvectionGainRate,
      65              :                            Real64 *ThermalRadiationGainRate, // pointer target for remote IR radiation gain value to be accessed
      66              :                            Real64 *LatentGainRate,
      67              :                            Real64 *ReturnAirLatentGainRate,
      68              :                            Real64 *CarbonDioxideGainRate,
      69              :                            Real64 *GenericContamGainRate,
      70              :                            int RetNodeNum // for return air heat gains
      71              : )
      72              : {
      73              :     // Distribute zone internal gain across all spaces in the zone weighted by floor area
      74           73 :     Real64 gainFrac = 1.0;
      75          146 :     for (int spaceNum : state.dataHeatBal->Zone(ZoneNum).spaceIndexes) {
      76           73 :         if (state.dataHeatBal->Zone(ZoneNum).numSpaces > 1) {
      77            2 :             gainFrac = state.dataHeatBal->space(spaceNum).FloorArea / state.dataHeatBal->Zone(ZoneNum).FloorArea;
      78              :         }
      79           73 :         SetupSpaceInternalGain(state,
      80              :                                spaceNum,
      81              :                                gainFrac,
      82              :                                cComponentName,
      83              :                                IntGainCompType,
      84              :                                ConvectionGainRate,
      85              :                                ReturnAirConvectionGainRate,
      86              :                                ThermalRadiationGainRate,
      87              :                                LatentGainRate,
      88              :                                ReturnAirLatentGainRate,
      89              :                                CarbonDioxideGainRate,
      90              :                                GenericContamGainRate,
      91              :                                RetNodeNum);
      92              :     }
      93           73 : }
      94          395 : void SetupSpaceInternalGain(EnergyPlusData &state,
      95              :                             int const spaceNum,
      96              :                             Real64 spaceGainFraction,              // Fraction of gain value assigned to this space
      97              :                             std::string_view const cComponentName, // user unique name for device
      98              :                             DataHeatBalance::IntGainType const IntGainCompType,
      99              :                             Real64 *ConvectionGainRate, // pointer target for remote convection gain value to be accessed
     100              :                             Real64 *ReturnAirConvectionGainRate,
     101              :                             Real64 *ThermalRadiationGainRate, // pointer target for remote IR radiation gain value to be accessed
     102              :                             Real64 *LatentGainRate,
     103              :                             Real64 *ReturnAirLatentGainRate,
     104              :                             Real64 *CarbonDioxideGainRate,
     105              :                             Real64 *GenericContamGainRate,
     106              :                             int RetNodeNum // for return air heat gains
     107              : )
     108              : {
     109              : 
     110              :     // SUBROUTINE INFORMATION:
     111              :     //       AUTHOR         B. Griffith
     112              :     //       DATE WRITTEN   November 2011
     113              : 
     114              :     // PURPOSE OF THIS SUBROUTINE:
     115              :     // provide a general interface for setting up devices with internal gains
     116              : 
     117              :     // METHODOLOGY EMPLOYED:
     118              :     // use pointers to access gain rates in device models
     119              :     // devices are internal gains like people, lights, electric equipment
     120              :     // and HVAC components with skin loss models like thermal tanks, and power conditioning.
     121              : 
     122          395 :     int constexpr DeviceAllocInc(100);
     123              : 
     124          395 :     bool FoundDuplicate = false;
     125          395 :     std::string UpperCaseObjectName = Util::makeUPPER(cComponentName);
     126              : 
     127          395 :     auto &thisIntGain = state.dataHeatBal->spaceIntGainDevices(spaceNum);
     128         2249 :     for (int IntGainsNum = 1; IntGainsNum <= thisIntGain.numberOfDevices; ++IntGainsNum) {
     129         1918 :         if ((thisIntGain.device(IntGainsNum).CompType == IntGainCompType) &&
     130           48 :             (thisIntGain.device(IntGainsNum).CompObjectName == UpperCaseObjectName)) {
     131           16 :             FoundDuplicate = true;
     132           16 :             break;
     133              :         }
     134              :     }
     135              : 
     136          395 :     if (FoundDuplicate) {
     137           32 :         ShowSevereError(state, "SetupZoneInternalGain: developer error, trapped duplicate internal gains sent to SetupZoneInternalGain");
     138           16 :         ShowContinueError(state, format("The duplicate object user name ={}", format(cComponentName)));
     139           32 :         ShowContinueError(state,
     140           32 :                           format("The duplicate object type = {}", format(DataHeatBalance::IntGainTypeNamesCC[static_cast<int>(IntGainCompType)])));
     141           32 :         ShowContinueError(state, "This internal gain will not be modeled, and the simulation continues");
     142           16 :         return;
     143              :     }
     144              : 
     145          379 :     if (thisIntGain.numberOfDevices == 0) {
     146          154 :         thisIntGain.device.allocate(DeviceAllocInc);
     147          154 :         thisIntGain.maxNumberOfDevices = DeviceAllocInc;
     148              :     } else {
     149          225 :         if (thisIntGain.numberOfDevices + 1 > thisIntGain.maxNumberOfDevices) {
     150            0 :             thisIntGain.device.redimension(thisIntGain.maxNumberOfDevices += DeviceAllocInc);
     151              :         }
     152              :     }
     153          379 :     ++thisIntGain.numberOfDevices;
     154              : 
     155          379 :     thisIntGain.device(thisIntGain.numberOfDevices).CompObjectName = UpperCaseObjectName;
     156          379 :     thisIntGain.device(thisIntGain.numberOfDevices).CompType = IntGainCompType;
     157          379 :     thisIntGain.device(thisIntGain.numberOfDevices).spaceGainFrac = spaceGainFraction;
     158              : 
     159              :     // note pointer assignments in code below!
     160          379 :     if (ConvectionGainRate) {
     161          377 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrConvectGainRate = ConvectionGainRate;
     162              :     } else {
     163            2 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrConvectGainRate = &state.dataHeatBal->zeroPointerVal;
     164              :     }
     165          379 :     if (ReturnAirConvectionGainRate) {
     166           76 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrReturnAirConvGainRate = ReturnAirConvectionGainRate;
     167              :     } else {
     168          303 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrReturnAirConvGainRate = &state.dataHeatBal->zeroPointerVal;
     169              :     }
     170          379 :     if (ThermalRadiationGainRate) {
     171          296 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrRadiantGainRate = ThermalRadiationGainRate;
     172              :     } else {
     173           83 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrRadiantGainRate = &state.dataHeatBal->zeroPointerVal;
     174              :     }
     175          379 :     if (LatentGainRate) {
     176          231 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrLatentGainRate = LatentGainRate;
     177              :     } else {
     178          148 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrLatentGainRate = &state.dataHeatBal->zeroPointerVal;
     179              :     }
     180          379 :     if (ReturnAirLatentGainRate) {
     181            2 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrReturnAirLatentGainRate = ReturnAirLatentGainRate;
     182              :     } else {
     183          377 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrReturnAirLatentGainRate = &state.dataHeatBal->zeroPointerVal;
     184              :     }
     185          379 :     if (CarbonDioxideGainRate) {
     186           76 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrCarbonDioxideGainRate = CarbonDioxideGainRate;
     187              :     } else {
     188          303 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrCarbonDioxideGainRate = &state.dataHeatBal->zeroPointerVal;
     189              :     }
     190          379 :     if (GenericContamGainRate) {
     191            0 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrGenericContamGainRate = GenericContamGainRate;
     192              :     } else {
     193          379 :         thisIntGain.device(thisIntGain.numberOfDevices).PtrGenericContamGainRate = &state.dataHeatBal->zeroPointerVal;
     194              :     }
     195          379 :     thisIntGain.device(thisIntGain.numberOfDevices).ReturnAirNodeNum = RetNodeNum;
     196          395 : }
     197              : 
     198              : } // namespace EnergyPlus
        

Generated by: LCOV version 2.0-1