Program Listing for File Sicart_ilwr.cpp

Program Listing for File Sicart_ilwr.cpp#

Return to documentation for file (src/modules/Sicart_ilwr.cpp)

//
// Canadian Hydrological Model - The Canadian Hydrological Model (CHM) is a novel
// modular unstructured mesh based approach for hydrological modelling
// Copyright (C) 2018 Christopher Marsh
//
// This file is part of Canadian Hydrological Model.
//
// Canadian Hydrological Model is free software: you can redistribute it and/or
// modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Canadian Hydrological Model is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Canadian Hydrological Model.  If not, see
// <http://www.gnu.org/licenses/>.
//

#include "Sicart_ilwr.hpp"
REGISTER_MODULE_CPP(Sicart_ilwr);

Sicart_ilwr::Sicart_ilwr(config_file cfg)
        : module_base("Sicart_ilwr", parallel::data, cfg)
{

    depends("t");
    depends("rh");
    depends("iswr");
    depends("atm_trans");
    depends("cloud_frac");
    provides("ilwr");

    SPDLOG_DEBUG("Successfully instantiated module {}",this->ID);
}

void Sicart_ilwr::init(mesh& domain)
{

}
void Sicart_ilwr::run(mesh_elem& face)
{
    double T = (*face)["t"_s]+273.15; //C->K
    double tau = (*face)["atm_trans"_s];
    if( (*face)["iswr"_s] < 3.)
    {
        tau = (*face)["cloud_frac"_s];
    }


    double RH = (*face)["rh"_s] / 100.0;
    double es = mio::Atmosphere::vaporSaturationPressure(T);//mio::Atmosphere::saturatedVapourPressure(T);
    double e =  es * RH;
    e = e * 0.01; // pa->mb
    double sigma = 5.67*pow(10.0,-8.0); //boltzman

    double Lin = 1.24*pow(e/T,1.0/7.0)*(1.0+0.44*RH-0.18*tau)*sigma*pow(T,4.0);

    double svf = 1.; //default open view
    if (face->has_parameter("svf"_s) && !is_nan(face->parameter("svf"_s)))
    {
        svf = face->parameter("svf"_s);
    }
    (*face)["ilwr"_s]= svf*Lin;
}

Sicart_ilwr::~Sicart_ilwr()
{

}