diff --git a/src/harp/add_absorber_earth.cpp b/src/harp/add_absorber_earth.cpp index bdf310b2..a95d0d0d 100644 --- a/src/harp/add_absorber_earth.cpp +++ b/src/harp/add_absorber_earth.cpp @@ -1,9 +1,111 @@ +// C/C++ +#include +#include +#include +#include + +// external +#include + // application #include +// opacity +#include +#include + +// utils +#include + // harp +#include "absorber.hpp" #include "radiation_band.hpp" void RadiationBand::addAbsorberEarth(ParameterInput *pin, YAML::Node &node) { - throw NotImplementedError("addAbsorberEarth"); + if (!node["parameters"]) { + node["parameters"] = {}; + } + + if (!node["model"]) { + node["model"] = "unspecified"; + } + + if (category_ == "infrared") { + addAbsorberEarthInfrared(node); + } else if (category_ == "visible") { + addAbsorberEarthVisible(node); + } else if (category_ == "ultraviolet") { + addAbsorberEarthUltraviolet(node); + } else { + throw NotFoundError("addAbsorberEarth", "Category: " + category_); + } + + absorbers_.back()->SetModel(node["model"].as()); +} + +void RadiationBand::addAbsorberEarthInfrared(YAML::Node &node) { + auto name = node["name"].as(); + auto params = ToParameterMap(node["parameters"]); + + std::vector species; + if (node["dependent-species"]) + species = node["dependent-species"].as>(); + + if (name == "CO2-CO2-CIA") { + // auto ab = std::make_unique(species, params); + + // absorbers_.push_back(std::move(ab)); + } else if (name == "CO2") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else if (name == "H2O") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else if (name == "O3") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else if (name == "O2") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else if (name == "CO") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else if (name == "SiO") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else { + throw NotFoundError("addAbsorberEarthInfrared", "Absorber " + name); + } +} + +void RadiationBand::addAbsorberEarthVisible(YAML::Node &node) { + auto name = node["name"].as(); + auto params = ToParameterMap(node["parameters"]); + + std::vector species; + if (node["dependent-species"]) + species = node["dependent-species"].as>(); + + if (name == "SiO") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else { + throw NotFoundError("addAbsorberEarthVisible", "Absorber " + name); + } +} + +void RadiationBand::addAbsorberEarthUltraviolet(YAML::Node &node) { + auto name = node["name"].as(); + auto params = ToParameterMap(node["parameters"]); + + std::vector species; + if (node["dependent-species"]) + species = node["dependent-species"].as>(); + + if (name == "SiO") { + auto ab = std::make_unique(name, species, params); + absorbers_.push_back(std::move(ab)); + } else { + throw NotFoundError("addAbsorberEarthUltraviolet", "Absorber " + name); + } } diff --git a/src/harp/radiation.cpp b/src/harp/radiation.cpp index 10545743..9e68a0d5 100644 --- a/src/harp/radiation.cpp +++ b/src/harp/radiation.cpp @@ -202,13 +202,15 @@ size_t Radiation::LoadRestartData(char *psrc) { } void Radiation::LoadAllRadiationBands(ParameterInput *pin) { - if (pin->DoesParameterExist("radiation", "infrared_bands")) { + if (pin->DoesParameterExist("radiation", "infrared_bands")) LoadRadiationBands(pin, "infrared_bands"); - } if (pin->DoesParameterExist("radiation", "visible_bands")) LoadRadiationBands(pin, "visible_bands"); + if (pin->DoesParameterExist("radiation", "ultraviolet_bands")) + LoadRadiationBands(pin, "ultraviolet_bands"); + if (pin->DoesParameterExist("radiation", "radio_bands")) LoadRadiationBands(pin, "radio_bands"); } diff --git a/src/harp/radiation_band.hpp b/src/harp/radiation_band.hpp index a60b5707..66f7b92f 100644 --- a/src/harp/radiation_band.hpp +++ b/src/harp/radiation_band.hpp @@ -100,6 +100,10 @@ class RadiationBand { void addAbsorberGiantsUltraviolet(YAML::Node &node); void addAbsorberEarth(ParameterInput *pin, YAML::Node &node); + void addAbsorberEarthInfrared(YAML::Node &node); + void addAbsorberEarthVisible(YAML::Node &node); + void addAbsorberEarthUltraviolet(YAML::Node &node); + void addAbsorberVenus(ParameterInput *pin, YAML::Node &node); void addAbsorberMars(ParameterInput *pin, YAML::Node &node);