LCOV - code coverage report
Current view: top level - EnergyPlus - FaultsManager.hh (source / functions) Coverage Total Hit
Test: lcov.output.filtered Lines: 70.5 % 61 43
Test Date: 2025-05-22 16:09:37 Functions: 54.5 % 22 12

            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              : #ifndef FaultsManager_hh_INCLUDED
      49              : #define FaultsManager_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              : #include <EnergyPlus/Plant/DataPlant.hh>
      59              : 
      60              : namespace EnergyPlus {
      61              : 
      62              : // Forward declarations
      63              : struct EnergyPlusData;
      64              : 
      65              : namespace FaultsManager {
      66              : 
      67              :     // Using/Aliasing
      68              : 
      69              :     // Data
      70              :     // MODULE PARAMETER DEFINITIONS
      71              : 
      72              :     // DERIVED TYPE DEFINITIONS:
      73              : 
      74              :     // MODULE VARIABLE TYPE DECLARATIONS:
      75              : 
      76              :     // ControllerTypeEnum
      77              :     int constexpr iController_AirEconomizer = 1001;
      78              : 
      79              :     // Input methods for fouling coils
      80              :     enum class FouledCoil
      81              :     {
      82              :         Invalid = -1,
      83              :         UARated,
      84              :         FoulingFactor,
      85              :         Num
      86              :     };
      87              : 
      88              :     // FaultTypeEnum
      89              :     enum class FaultType
      90              :     {
      91              :         Invalid = -1,
      92              :         TemperatureSensorOffset_OutdoorAir,
      93              :         HumiditySensorOffset_OutdoorAir,
      94              :         EnthalpySensorOffset_OutdoorAir,
      95              :         TemperatureSensorOffset_ReturnAir,
      96              :         EnthalpySensorOffset_ReturnAir,
      97              :         Fouling_Coil,
      98              :         ThermostatOffset,
      99              :         HumidistatOffset,
     100              :         Fouling_AirFilter,
     101              :         TemperatureSensorOffset_ChillerSupplyWater,
     102              :         TemperatureSensorOffset_CondenserSupplyWater,
     103              :         Fouling_Tower,
     104              :         TemperatureSensorOffset_CoilSupplyAir,
     105              :         Fouling_Boiler,
     106              :         Fouling_Chiller,
     107              :         Fouling_EvapCooler,
     108              :         Num
     109              :     };
     110              : 
     111              :     // Types of faults under Group Operational Faults in IDD
     112              :     //  1. Temperature sensor offset (FY14)
     113              :     //  2. Humidity sensor offset (FY14)
     114              :     //  3. Enthalpy sensor offset (FY14)
     115              :     //  4. Fouling coils (FY14)
     116              :     //  5. Thermostat offset (FY15)
     117              :     //  6. Humidistat offset (FY15)
     118              :     //  7. Fouling air filter (FY15)
     119              :     //  8. Chiller Supply Water Temperature Sensor Offset (FY16)
     120              :     //  9. Condenser Supply Water Temperature Sensor Offset (FY16)
     121              :     //  10. Cooling Tower Scaling (FY16)
     122              :     //  11. Coil Supply Air Temperature Sensor Offset (FY16)
     123              :     // coming ...
     124              :     //  Fouling: chillers, boilers, cooling towers
     125              :     //  Damper leakage: return air, outdoor air
     126              :     //  Blockage: pipe
     127              :     //  Meter: air flow, water flow
     128              :     //  CO2 sensor
     129              :     //  Pressure sensor offset
     130              :     //  more
     131              : 
     132              :     //      'FaultModel:PressureSensorOffset:OutdoorAir   ', &
     133              :     //      'FaultModel:TemperatureSensorOffset:SupplyAir ', &
     134              :     //      'FaultModel:TemperatureSensorOffset:ZoneAir   ', &
     135              :     //      'FaultModel:Blockage:Branch                   ', &
     136              :     //      'FaultModel:Dirty:AirFilter                   ', &
     137              :     //      'FaultModel:Fouling:Chiller                   ', &
     138              :     //      'FaultModel:Fouling:Boiler                    ', &
     139              :     //      'FaultModel:Fouling:CoolingTower              ', &
     140              :     //      'FaultModel:DamperLeakage:ReturnAir           ', &
     141              :     //      'FaultModel:DamperLeakage:OutdoorAir          ' /)
     142              : 
     143              :     // SUBROUTINE SPECIFICATIONS:
     144              : 
     145              :     // Types
     146              : 
     147              :     struct FaultProperties // Base Class for operational faults
     148              :     {
     149              :         // Members
     150              :         std::string Name;
     151              :         FaultType type = FaultType::Invalid;
     152              :         Sched::Schedule *availSched = nullptr;
     153              :         Sched::Schedule *severitySched = nullptr;
     154              :         Real64 Offset = 0.0; // offset, + means sensor reading is higher than actual value
     155              :         bool Status = false; // for future use
     156              : 
     157              :         // Virtual Destructor
     158           16 :         virtual ~FaultProperties() = default;
     159              : 
     160              :     public:
     161              :         Real64 CalFaultOffsetAct(EnergyPlusData &state);
     162              :     };
     163              : 
     164              :     struct FaultPropertiesEconomizer : public FaultProperties // Class for fault models related with economizer
     165              :     {
     166              :         // Members
     167              :         int ControllerTypeEnum;
     168              :         int ControllerID;           // Point to a controller associated with the fault
     169              :         std::string ControllerType; // Controller type
     170              :         std::string ControllerName; // Controller name
     171              : 
     172              :         // Default Constructor
     173           20 :         FaultPropertiesEconomizer() : ControllerTypeEnum(0), ControllerID(0), ControllerType(""), ControllerName("")
     174              :         {
     175            5 :         }
     176              : 
     177              :         // Destructor
     178            5 :         virtual ~FaultPropertiesEconomizer() = default;
     179              :     };
     180              : 
     181              :     struct FaultPropertiesThermostat : public FaultProperties // Class for FaultModel:ThermostatOffset
     182              :     {
     183              :         // Members
     184              :         std::string FaultyThermostatName; // The faulty thermostat name
     185              : 
     186              :         // Default Constructor
     187            0 :         FaultPropertiesThermostat() : FaultyThermostatName("")
     188              :         {
     189            0 :         }
     190              : 
     191              :         // Destructor
     192            0 :         virtual ~FaultPropertiesThermostat() = default;
     193              :     };
     194              : 
     195              :     struct FaultPropertiesHumidistat : public FaultProperties // Class for FaultModel:HumidistatOffset
     196              :     {
     197              :         // Members
     198              :         std::string FaultyThermostatName; // The faulty thermostat name
     199              :         std::string FaultyHumidistatName; // The faulty humidistat name
     200              :         std::string FaultyHumidistatType; // The faulty humidistat type
     201              : 
     202              :         // Default Constructor
     203            0 :         FaultPropertiesHumidistat() : FaultyThermostatName(""), FaultyHumidistatName(""), FaultyHumidistatType("")
     204              :         {
     205            0 :         }
     206              : 
     207              :         // Destructor
     208            0 :         virtual ~FaultPropertiesHumidistat() = default;
     209              :     };
     210              : 
     211              :     struct FaultPropertiesFoulingCoil : public FaultProperties // Class for FaultModel:Fouling:Coil
     212              :     {
     213              :         // Members
     214              :         std::string FouledCoilName;                   // The fouled coil name
     215              :         DataPlant::PlantEquipmentType FouledCoilType; // Type of coil that's fouled
     216              :         int FouledCoilNum;             // The "FouledUARated" implies having to use the Coil's UA, which could be autosized, so have to use this index
     217              :         FouledCoil FoulingInputMethod; // Coil fouling input method
     218              :         Real64 UAFouled;               // Fouling coil UA under rating conditions
     219              :         Real64 Rfw;                    // Water side fouling factor
     220              :         Real64 Rfa;                    // Air side fouling factor
     221              :         Real64 Aout;                   // Coil outside surface area
     222              :         Real64 Aratio;                 // Inside to outside surface area ratio
     223              : 
     224              :         // Default Constructor
     225            4 :         FaultPropertiesFoulingCoil()
     226            4 :             : FouledCoilName(""), FouledCoilType(DataPlant::PlantEquipmentType::Invalid), FouledCoilNum(0), FoulingInputMethod(FouledCoil::Invalid),
     227            4 :               UAFouled(0.0), Rfw(0.0), Rfa(0.0), Aout(0.0), Aratio(0.0)
     228              :         {
     229            4 :         }
     230              : 
     231              :         // Destructor
     232            4 :         virtual ~FaultPropertiesFoulingCoil() = default;
     233              : 
     234              :     public:
     235              :         // Calculate the fouling thermal insulance factor (the reciprocal of a heat transfer coefficient) due to fouling in a coil
     236              :         // Real64 CalFaultyCoilFoulingFactor();
     237              : 
     238              :         // Calculate the Fault Fraction based on Availability and Severity Schedules
     239              :         Real64 FaultFraction(EnergyPlusData &state);
     240              :     };
     241              : 
     242              :     struct FaultPropertiesAirFilter : public FaultProperties // Class for FaultModel:Fouling:AirFilter, derived from FaultProperties
     243              :     {
     244              :         // Members
     245              :         std::string fanName; // The name of the fan corresponding to the fouled air filter
     246              :         int fanNum = 0;
     247              :         HVAC::FanType fanType = HVAC::FanType::Invalid; // The type of the fan corresponding to the fouled air filter
     248              :         int fanCurveNum = 0;                            // The index to the curve
     249              :         Sched::Schedule *pressFracSched = nullptr;      // The pointer to the schedule
     250              :         Real64 fanPressInc = 0.0;                       // The increase of the fan pressure due to fouled air filter
     251              :         Real64 fanFlowDec = 0.0;                        // The decrease of the fan airflow rate due to fouled air filter
     252              : 
     253              :         // Destructor
     254            4 :         virtual ~FaultPropertiesAirFilter() = default;
     255              : 
     256              :     public:
     257              :         bool CheckFaultyAirFilterFanCurve(EnergyPlusData &state);
     258              :     };
     259              : 
     260              :     struct FaultPropertiesCoilSAT : public FaultProperties // Class for FaultModel:TemperatureSensorOffset:CoilSupplyAir
     261              :     {
     262              :         // Members
     263              :         std::string CoilType;                // Coil type
     264              :         std::string CoilName;                // Coil name
     265              :         std::string WaterCoilControllerName; // Water coil controller name
     266              : 
     267              :         // Default Constructor
     268            6 :         FaultPropertiesCoilSAT() : CoilType(""), CoilName(""), WaterCoilControllerName("")
     269              :         {
     270            1 :         }
     271              :     };
     272              : 
     273              :     struct FaultPropertiesChillerSWT : public FaultProperties // Class for FaultModel:TemperatureSensorOffset:ChillerSupplyWater
     274              :     {
     275              :         // Members
     276              :         std::string ChillerType; // Chiller type
     277              :         std::string ChillerName; // Chiller name
     278              : 
     279              :         // Default Constructor
     280            4 :         FaultPropertiesChillerSWT() : ChillerType(""), ChillerName("")
     281              :         {
     282            1 :         }
     283              : 
     284              :         // Destructor
     285            1 :         virtual ~FaultPropertiesChillerSWT() = default;
     286              : 
     287              :     public:
     288              :         void CalFaultChillerSWT(bool FlagConstantFlowChiller,  // True if chiller is constant flow and false if it is variable flow
     289              :                                 Real64 FaultyChillerSWTOffset, // Faulty chiller SWT sensor offset
     290              :                                 Real64 Cp,                     // Local fluid specific heat
     291              :                                 Real64 EvapInletTemp,          // Chiller evaporator inlet water temperature
     292              :                                 Real64 &EvapOutletTemp,        // Chiller evaporator outlet water temperature
     293              :                                 Real64 &EvapMassFlowRate,      // Chiller mass flow rate
     294              :                                 Real64 &QEvaporator            // Chiller evaporator heat transfer rate
     295              :         );
     296              :     };
     297              : 
     298              :     struct FaultPropertiesCondenserSWT : public FaultProperties // Class for FaultModel:TemperatureSensorOffset:CondenserSupplyWater
     299              :     {
     300              :         // Members
     301              :         std::string TowerType; // Tower type
     302              :         std::string TowerName; // Tower name
     303              : 
     304              :         // Default Constructor
     305            0 :         FaultPropertiesCondenserSWT() : TowerType(""), TowerName("")
     306              :         {
     307            0 :         }
     308              :     };
     309              : 
     310              :     struct FaultPropertiesTowerFouling : public FaultProperties // Class for FaultModel:Fouling:CoolingTower
     311              :     {
     312              :         // Members
     313              :         std::string TowerType;    // Tower type
     314              :         std::string TowerName;    // Tower name
     315              :         Real64 UAReductionFactor; // UA Reduction Factor
     316              : 
     317              :         // Default Constructor
     318            0 :         FaultPropertiesTowerFouling() : TowerType(""), TowerName(""), UAReductionFactor(1.0)
     319              :         {
     320            0 :         }
     321              : 
     322              :     public:
     323              :         Real64 CalFaultyTowerFoulingFactor(EnergyPlusData &state);
     324              :     };
     325              : 
     326              :     struct FaultPropertiesFouling : public FaultProperties // Class for FaultModel:Fouling
     327              :     {
     328              :         // Members
     329              :         Real64 FoulingFactor; // Fouling Factor
     330              : 
     331              :         // Default Constructor
     332            0 :         FaultPropertiesFouling() : FoulingFactor(1.0)
     333              :         {
     334            0 :         }
     335              : 
     336              :     public:
     337              :         Real64 CalFoulingFactor(EnergyPlusData &state); // To calculate the dynamic fouling factor
     338              :     };
     339              : 
     340              :     struct FaultPropertiesBoilerFouling : public FaultPropertiesFouling // Class for FaultModel:Fouling:Boiler
     341              :     {
     342              :         // Members
     343              :         std::string BoilerType; // Boiler type
     344              :         std::string BoilerName; // Boiler name
     345              : 
     346              :         // Default Constructor
     347            0 :         FaultPropertiesBoilerFouling() : BoilerType(""), BoilerName("")
     348              :         {
     349            0 :         }
     350              :     };
     351              : 
     352              :     struct FaultPropertiesChillerFouling : public FaultPropertiesFouling // Class for FaultModel:Fouling:Chiller
     353              :     {
     354              :         // Members
     355              :         std::string ChillerType; // Chiller type
     356              :         std::string ChillerName; // Chiller name
     357              : 
     358              :         // Default Constructor
     359            0 :         FaultPropertiesChillerFouling() : ChillerType(""), ChillerName("")
     360              :         {
     361            0 :         }
     362              :     };
     363              : 
     364              :     struct FaultPropertiesEvapCoolerFouling : public FaultPropertiesFouling // Class for FaultModel:Fouling:EvaporativeCooler
     365              :     {
     366              :         // Members
     367              :         std::string EvapCoolerType; // Evaporative Cooler type
     368              :         std::string EvapCoolerName; // Evaporative Cooler name
     369              : 
     370              :         // Default Constructor
     371            0 :         FaultPropertiesEvapCoolerFouling() : EvapCoolerType(""), EvapCoolerName("")
     372              :         {
     373            0 :         }
     374              :     };
     375              : 
     376              :     // Functions
     377              : 
     378              :     void CheckAndReadFaults(EnergyPlusData &state);
     379              : 
     380              :     void SetFaultyCoilSATSensor(
     381              :         EnergyPlusData &state, std::string const &CompType, std::string_view CompName, bool &FaultyCoilSATFlag, int &FaultyCoilSATIndex);
     382              : 
     383              : } // namespace FaultsManager
     384              : 
     385              : struct FaultsManagerData : BaseGlobalStruct
     386              : {
     387              : 
     388              :     bool RunFaultMgrOnceFlag = false; // True if CheckAndReadFaults is already done
     389              :     bool ErrorsFound = false;         // True if errors detected in input
     390              : 
     391              :     bool AnyFaultsInModel = false;       // True if there are operational faults in the model
     392              :     int NumFaults = 0;                   // Number of faults (include multiple faults of same type) in the model
     393              :     int NumFaultyEconomizer = 0;         // Total number of faults related with the economizer
     394              :     int NumFouledCoil = 0;               // Total number of fouled coils
     395              :     int NumFaultyThermostat = 0;         // Total number of faulty thermostat with offset
     396              :     int NumFaultyHumidistat = 0;         // Total number of faulty humidistat with offset
     397              :     int NumFaultyAirFilter = 0;          // Total number of fouled air filters
     398              :     int NumFaultyChillerSWTSensor = 0;   // Total number of faulty Chillers Supply Water Temperature Sensor
     399              :     int NumFaultyCondenserSWTSensor = 0; // Total number of faulty Condenser Supply Water Temperature Sensor
     400              :     int NumFaultyTowerFouling = 0;       // Total number of faulty Towers with Scaling
     401              :     int NumFaultyCoilSATSensor = 0;      // Total number of faulty Coil Supply Air Temperature Sensor
     402              :     int NumFaultyBoilerFouling = 0;      // Total number of faulty Boilers with Fouling
     403              :     int NumFaultyChillerFouling = 0;     // Total number of faulty Chillers with Fouling
     404              :     int NumFaultyEvapCoolerFouling = 0;  // Total number of faulty Evaporative Coolers with Fouling
     405              : 
     406              :     // Object Data
     407              :     Array1D<FaultsManager::FaultPropertiesEconomizer> FaultsEconomizer;
     408              :     Array1D<FaultsManager::FaultPropertiesFoulingCoil> FouledCoils;
     409              :     Array1D<FaultsManager::FaultPropertiesThermostat> FaultsThermostatOffset;
     410              :     Array1D<FaultsManager::FaultPropertiesHumidistat> FaultsHumidistatOffset;
     411              :     Array1D<FaultsManager::FaultPropertiesAirFilter> FaultsFouledAirFilters;
     412              :     Array1D<FaultsManager::FaultPropertiesChillerSWT> FaultsChillerSWTSensor;
     413              :     Array1D<FaultsManager::FaultPropertiesCondenserSWT> FaultsCondenserSWTSensor;
     414              :     Array1D<FaultsManager::FaultPropertiesTowerFouling> FaultsTowerFouling;
     415              :     Array1D<FaultsManager::FaultPropertiesCoilSAT> FaultsCoilSATSensor;
     416              :     Array1D<FaultsManager::FaultPropertiesBoilerFouling> FaultsBoilerFouling;
     417              :     Array1D<FaultsManager::FaultPropertiesChillerFouling> FaultsChillerFouling;
     418              :     Array1D<FaultsManager::FaultPropertiesEvapCoolerFouling> FaultsEvapCoolerFouling;
     419              : 
     420         2126 :     void init_constant_state([[maybe_unused]] EnergyPlusData &state) override
     421              :     {
     422         2126 :     }
     423              : 
     424         1152 :     void init_state([[maybe_unused]] EnergyPlusData &state) override
     425              :     {
     426         1152 :     }
     427              : 
     428         2100 :     void clear_state() override
     429              :     {
     430         2100 :         RunFaultMgrOnceFlag = false;
     431         2100 :         ErrorsFound = false;
     432         2100 :         AnyFaultsInModel = false;
     433         2100 :         NumFaults = 0;
     434         2100 :         NumFaultyEconomizer = 0;
     435         2100 :         NumFouledCoil = 0;
     436         2100 :         NumFaultyThermostat = 0;
     437         2100 :         NumFaultyHumidistat = 0;
     438         2100 :         NumFaultyAirFilter = 0;
     439         2100 :         NumFaultyChillerSWTSensor = 0;
     440         2100 :         NumFaultyCondenserSWTSensor = 0;
     441         2100 :         NumFaultyTowerFouling = 0;
     442         2100 :         NumFaultyCoilSATSensor = 0;
     443              : 
     444         2100 :         FaultsEconomizer.deallocate();
     445         2100 :         FouledCoils.deallocate();
     446         2100 :         FaultsThermostatOffset.deallocate();
     447         2100 :         FaultsHumidistatOffset.deallocate();
     448         2100 :         FaultsFouledAirFilters.deallocate();
     449         2100 :         FaultsChillerSWTSensor.deallocate();
     450         2100 :         FaultsCondenserSWTSensor.deallocate();
     451         2100 :         FaultsTowerFouling.deallocate();
     452         2100 :         FaultsCoilSATSensor.deallocate();
     453         2100 :     }
     454              : };
     455              : 
     456              : } // namespace EnergyPlus
     457              : 
     458              : #endif
        

Generated by: LCOV version 2.0-1