|
4 | 4 | * @author Tim Spain <[email protected]> |
5 | 5 | */ |
6 | 6 |
|
7 | | -#include <ElementData.hpp> |
| 7 | +#define CATCH_CONFIG_MAIN |
| 8 | +#include <catch2/catch.hpp> |
| 9 | +#include <sstream> |
| 10 | + |
| 11 | +#include "include/ConfiguredModule.hpp" |
| 12 | +#include "include/ElementData.hpp" |
| 13 | +#include "include/IIceAlbedo.hpp" |
| 14 | +#include "include/ModuleLoader.hpp" |
| 15 | +#include "include/NextsimPhysics.hpp" |
8 | 16 |
|
9 | 17 | namespace Nextsim { |
10 | 18 |
|
| 19 | +TEST_CASE("Physics test using NextsimPhysics", "[ElementData]") |
| 20 | +{ |
| 21 | + // Largely copied from the "Melting conditions" test of NextsimPhysics |
| 22 | + Configurator::clear(); |
| 23 | + std::stringstream config; |
| 24 | + config << "[Modules]" << std::endl; |
| 25 | + config << "Nextsim::IFreezingPoint = Nextsim::UnescoFreezing" << std::endl; |
| 26 | + config << "Nextsim::IIceAlbedo = Nextsim::CCSMIceAlbedo" << std::endl; |
| 27 | + config << "Nextsim::IPhysics1d = Nextsim::NextsimPhysics" << std::endl; |
| 28 | + config << std::endl; |
| 29 | + config << "[CCSMIceAlbedo]" << std::endl; |
| 30 | + config << "iceAlbedo = 0.63" << std::endl; |
| 31 | + config << "snowAlbedo = 0.88" << std::endl; |
| 32 | + |
| 33 | + std::unique_ptr<std::istream> pcstream(new std::stringstream(config.str())); |
| 34 | + Configurator::addStream(std::move(pcstream)); |
| 35 | + |
| 36 | + double tair = 3; //˚C |
| 37 | + double tdew = 2; //˚C |
| 38 | + double pair = 100000; // Pa, slightly low pressure |
| 39 | + double sst = -1; //˚C |
| 40 | + double sss = 32; // PSU |
| 41 | + std::array<double, N_ICE_TEMPERATURES> tice = { -1., -1., -1. }; //˚C |
| 42 | + double hice = 0.1; // m |
| 43 | + double cice = 0.5; |
| 44 | + double hsnow = 0.01; // m |
| 45 | + double dml = 10.; // m |
| 46 | + |
| 47 | + ModuleLoader::getLoader().setAllDefaults(); |
| 48 | + ConfiguredModule::parseConfigurator(); |
| 49 | + tryConfigure(ModuleLoader::getLoader().getImplementation<IIceAlbedo>()); |
| 50 | + |
| 51 | + ElementData data; |
| 52 | + data.configure(); // Configure with the UNESCO freezing point |
| 53 | + |
| 54 | + data = PrognosticData::generate(hice, cice, sst, sss, hsnow, tice); |
| 55 | + data.setTimestep(600.); // s. Very long TS to get below freezing |
| 56 | + |
| 57 | + data.airTemperature() = tair; |
| 58 | + data.dewPoint2m() = tdew; |
| 59 | + data.airPressure() = pair; |
| 60 | + data.mixedLayerDepth() = dml; |
| 61 | + data.incomingLongwave() = 330; |
| 62 | + data.incomingShortwave() = 50; |
| 63 | + data.snowfall() = 0; |
| 64 | + |
| 65 | + data.windSpeed() = 5; |
| 66 | + |
| 67 | + data.updateDerivedData(data, data, data); |
| 68 | + REQUIRE(1.26488 == Approx(data.airDensity()).epsilon(1e-4)); |
| 69 | + REQUIRE(0.00441973 == Approx(data.specificHumidityAir()).epsilon(1e-4)); |
| 70 | + REQUIRE(0.0035214 == Approx(data.specificHumidityIce()).epsilon(1e-4)); |
| 71 | + REQUIRE(1012.86 == Approx(data.heatCapacityWetAir()).epsilon(1e-4)); |
| 72 | + |
| 73 | + data.calculate(data, data, data); |
| 74 | + |
| 75 | + REQUIRE(0.12846 == Approx(data.updatedIceTrueThickness()).epsilon(1e-4)); |
| 76 | + REQUIRE(0.01957732 == Approx(data.updatedSnowTrueThickness()).epsilon(1e-4)); |
| 77 | + REQUIRE(0.368269 == Approx(data.updatedIceConcentration()).epsilon(1e-4)); |
| 78 | + REQUIRE(0.0 == Approx(data.updatedIceSurfaceTemperature()).epsilon(1e-4)); |
| 79 | +} |
11 | 80 | } /* namespace Nextsim */ |
0 commit comments