diff --git a/CMakeLists.txt b/CMakeLists.txt index 898a692..01c113f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -80,6 +80,7 @@ SET(SOURCE src/behave/palmettoGallberry.cpp src/behave/randfuel.cpp src/behave/randthread.cpp + src/behave/relativeHumidity.cpp src/behave/safety.cpp src/behave/slopeTool.cpp src/behave/species_master_table.cpp @@ -121,6 +122,7 @@ SET(HEADERS src/behave/palmettoGallberry.h src/behave/randfuel.h src/behave/randthread.h + src/behave/relativeHumidity.h src/behave/safety.h src/behave/slopeTool.h src/behave/species_master_table.h diff --git a/src/behave/relativeHumidity.cpp b/src/behave/relativeHumidity.cpp new file mode 100644 index 0000000..3c695c7 --- /dev/null +++ b/src/behave/relativeHumidity.cpp @@ -0,0 +1,135 @@ +#include +#include "relativeHumidity.h" + +// Constructors +RelativeHumidityTool::RelativeHumidityTool() { + dryBulbTemperature_ = 0.; + wetBulbTemperature_ = 0.; + siteElevation_ = 0.; + wetBulbDepression_ = 0.; + dewPointTemperature_ = 0.; + relativeHumidity_ = 0.; +} + +RelativeHumidityTool::RelativeHumidityTool(const RelativeHumidityTool &rhs) { + memberwiseCopyAssignment(rhs); +} + +RelativeHumidityTool& RelativeHumidityTool::operator=(const RelativeHumidityTool& rhs) { + if (this != &rhs) { + memberwiseCopyAssignment(rhs); + } + return *this; +} + +void RelativeHumidityTool::memberwiseCopyAssignment(const RelativeHumidityTool& rhs) +{ + dryBulbTemperature_ = rhs.dryBulbTemperature_; + wetBulbTemperature_ = rhs.wetBulbTemperature_; + siteElevation_ = rhs.siteElevation_; + + wetBulbDepression_ = rhs.wetBulbDepression_; + dewPointTemperature_ = rhs.dewPointTemperature_; + relativeHumidity_ = rhs.relativeHumidity_; +} + +RelativeHumidityTool::~RelativeHumidityTool() {} + +// Calculate +void RelativeHumidityTool::calculate() { + double dryBulbTemp = TemperatureUnits::fromBaseUnits(dryBulbTemperature_, TemperatureUnits::Celsius); + double wetBulbTemp = TemperatureUnits::fromBaseUnits(wetBulbTemperature_, TemperatureUnits::Celsius); + double siteElevation = LengthUnits::fromBaseUnits(siteElevation_, LengthUnits::Meters); + + // Calculate Dew Point + double dewPointTemp = dryBulbTemp; + + if ( wetBulbTemp < dryBulbTemp ) { + + double e2 = 6.1121 * exp( 17.502 * wetBulbTemp / (240.97 + wetBulbTemp) ); + + if ( wetBulbTemp < 0. ) { + e2 = 6.1115 * exp( 22.452 * wetBulbTemp / ( 272.55 + wetBulbTemp) ); + } + + double p = 1013. * exp( -0.0000375 * siteElevation); + double d = 0.66 * ( 1. + 0.00115 * wetBulbTemp) * (dryBulbTemp - wetBulbTemp); + double e3 = e2 - d * p / 1000.; + + if ( e3 < 0.001 ) { + e3 = 0.001; + } + + dewPointTemp = -240.97 / ( 1.- 17.502 / log(e3 / 6.1121) ); + + if ( dewPointTemp < -40. ) { + dewPointTemp = -40.; + } + } + + // Calculate Relative Humidity + double relativeHumidity = 0.; + + // Convert to Fahrenheit + double dewPointTempF = dewPointTemp * 9. / 5. + 32.0; + double dryBulbTempF = dryBulbTemp * 9. / 5. + 32.0; + + if ( dewPointTempF >= dryBulbTempF ) { + relativeHumidity = 1.0; + } else { + relativeHumidity = exp( -7469. / ( dewPointTempF + 398.0 ) + 7469. / ( dryBulbTempF + 398.0 ) ); + } + + // Store results + dewPointTemperature_ = TemperatureUnits::toBaseUnits(dewPointTemp, TemperatureUnits::Celsius); + relativeHumidity_ = FractionUnits::toBaseUnits(relativeHumidity, FractionUnits::Fraction); +} + +// Getters +double RelativeHumidityTool::getDryBulbTemperature(TemperatureUnits::TemperatureUnitsEnum temperatureUnits) { + return TemperatureUnits::fromBaseUnits(dryBulbTemperature_, temperatureUnits); +} + +double RelativeHumidityTool::getWetBulbTemperature(TemperatureUnits::TemperatureUnitsEnum temperatureUnits) { + return TemperatureUnits::fromBaseUnits(wetBulbTemperature_, temperatureUnits); +} + +double RelativeHumidityTool::getSiteElevation(LengthUnits::LengthUnitsEnum lengthUnits) { + return LengthUnits::fromBaseUnits(siteElevation_, lengthUnits); +} + +double RelativeHumidityTool::getWetBulbDepression(TemperatureUnits::TemperatureUnitsEnum temperatureUnits) { + double dryBulbTemp = TemperatureUnits::fromBaseUnits(dryBulbTemperature_, TemperatureUnits::Celsius); + double wetBulbTemp = TemperatureUnits::fromBaseUnits(wetBulbTemperature_, TemperatureUnits::Celsius); + + double wetBulbDep = dryBulbTemp - wetBulbTemp; + + if (temperatureUnits == TemperatureUnits::Celsius) { + return wetBulbDep; + } else { + return wetBulbDep * 1.8; + } + +} + +double RelativeHumidityTool::getDewPointTemperature(TemperatureUnits::TemperatureUnitsEnum temperatureUnits) { + return TemperatureUnits::fromBaseUnits(dewPointTemperature_, temperatureUnits); +} + +double RelativeHumidityTool::getRelativeHumidity(FractionUnits::FractionUnitsEnum fractionUnits) { + return FractionUnits::fromBaseUnits(relativeHumidity_, fractionUnits); +} + +// Setters +void RelativeHumidityTool::setDryBulbTemperature(double dryBulbTemperature, TemperatureUnits::TemperatureUnitsEnum temperatureUnits) { + dryBulbTemperature_ = TemperatureUnits::toBaseUnits(dryBulbTemperature, temperatureUnits); +} + +void RelativeHumidityTool::setWetBulbTemperature(double wetBulbTemperature, TemperatureUnits::TemperatureUnitsEnum temperatureUnits) { + wetBulbTemperature_ = TemperatureUnits::toBaseUnits(wetBulbTemperature, temperatureUnits); +} + +void RelativeHumidityTool::setSiteElevation(double siteElevation, LengthUnits::LengthUnitsEnum lengthUnits) { + siteElevation_ = LengthUnits::toBaseUnits(siteElevation, lengthUnits); +} + diff --git a/src/behave/relativeHumidity.h b/src/behave/relativeHumidity.h new file mode 100644 index 0000000..9d61412 --- /dev/null +++ b/src/behave/relativeHumidity.h @@ -0,0 +1,47 @@ +#pragma once +#include "behaveUnits.h" + +class RelativeHumidityTool { +public: + + // Constructors + RelativeHumidityTool(); + RelativeHumidityTool(const RelativeHumidityTool& rhs); + RelativeHumidityTool& operator=(const RelativeHumidityTool& rhs); + + // Destructors + ~RelativeHumidityTool(); + + // Calculate + void calculate(); + + // Getters + double getDryBulbTemperature(TemperatureUnits::TemperatureUnitsEnum temperatureUnits); + double getSiteElevation(LengthUnits::LengthUnitsEnum lengthUnits); + double getWetBulbTemperature(TemperatureUnits::TemperatureUnitsEnum temperatureUnits); + + double getDewPointTemperature(TemperatureUnits::TemperatureUnitsEnum temperatureUnits); + double getRelativeHumidity(FractionUnits::FractionUnitsEnum fractionUnits); + double getWetBulbDepression(TemperatureUnits::TemperatureUnitsEnum temperatureUnits); + + // Setters + void setDryBulbTemperature(double dryBulbTemperature, TemperatureUnits::TemperatureUnitsEnum temperatureUnits); + void setSiteElevation(double siteElevation, LengthUnits::LengthUnitsEnum lengthUnits); + void setWetBulbTemperature(double wetBulbTemperature, TemperatureUnits::TemperatureUnitsEnum temperatureUnits); + + +protected: + void memberwiseCopyAssignment(const RelativeHumidityTool& rhs); + + // Input Variables + double dryBulbTemperature_ = 0; + double siteElevation_ = 0; + double wetBulbTemperature_ = 0; + + // Output Variables + double dewPointTemperature_ = 0; + double relativeHumidity_ = 0; + double wetBulbDepression_ = 0; +}; + +