WSL/SLF GitLab Repository

Commit c7e14b98 authored by Mathias Bavay's avatar Mathias Bavay
Browse files

Finally, a long awaited (and MAJOR) change: HNW is gone, it is now PSUM. This...

Finally, a long awaited (and MAJOR) change: HNW is gone, it is now PSUM. This name should be clearer and every occurences of "HNW" (even in temporary variables or algorithms) have been replaced by psum. A check is performed on keys containing "hnw" and an exception is thrown if some are found, urging the user to update the ini file. Please keep in mind that the calling codes have to now refer to MeteoData::PSUM and that some algorithms are now named differently!
parent 8d24bbee
......@@ -64,11 +64,7 @@ ELSE(MSVC)
ENDIF()
IF(GCC_VERSION VERSION_GREATER 4.8 OR GCC_VERSION VERSION_EQUAL 4.8)
SET(OPTIM "${OPTIM} -flto") #for gcc>4.5, but first implementations were slow, so it is safe to enforce 4.8
IF(CMAKE_BUILD_TYPE STREQUAL "debug")
SET(LEAKS_CHECK ON CACHE BOOL "Set to ON to dynamically check for memory corruption")
else()
SET(LEAKS_CHECK OFF CACHE BOOL "Set to ON to dynamically check for memory corruption")
ENDIF()
SET(LEAKS_CHECK OFF CACHE BOOL "Set to ON to dynamically check for memory corruption (and do the same for applications linked with MeteoIO)")
IF (LEAKS_CHECK)
SET(EXTRA "${EXTRA} -fsanitize=address -fno-omit-frame-pointer")
ENDIF(LEAKS_CHECK)
......
......@@ -24,8 +24,8 @@ int main(int /*argc*/, char** argv) {
Grid2DObject param;
io.getMeteoData(d1, dem, MeteoData::TA, param);
io.write2DGrid(param, MeteoGrids::TA, d1);
io.getMeteoData(d1, dem, MeteoData::HNW, param);
io.write2DGrid(param, MeteoGrids::HNW, d1);
io.getMeteoData(d1, dem, MeteoData::PSUM, param);
io.write2DGrid(param, MeteoGrids::PSUM, d1);
io.getMeteoData(d1, dem, MeteoData::RH, param);
io.write2DGrid(param, MeteoGrids::RH, d1);
......
......@@ -101,12 +101,12 @@ RH::arg1 = 0.01 1.2
RH::filter2 = min_max
RH::arg2 = soft 0.05 1.0
HNW::filter1 = min
HNW::arg1 = -0.1
HNW::filter2 = min
HNW::arg2 = soft 0.
HNW::filter3 = Undercatch_WMO
HNW::arg3 = Hellmann
PSUM::filter1 = min
PSUM::arg1 = -0.1
PSUM::filter2 = min
PSUM::arg2 = soft 0.
PSUM::filter3 = Undercatch_WMO
PSUM::arg3 = Hellmann
ISWR::filter1 = min_max
ISWR::arg1 = -10. 1500.
......@@ -155,8 +155,8 @@ HS::resample = linear
VW::resample = nearest
VW::nearest = extrapolate
HNW::resample = accumulate
HNW::accumulate = 3600
PSUM::resample = accumulate
PSUM::accumulate = 3600
[Interpolations2D]
TA::algorithms = IDW_LAPSE CST_LAPSE
......@@ -165,8 +165,8 @@ TA::idw_lapse = -0.008 soft
RH::algorithms = RH IDW_LAPSE CST
HNW::algorithms = IDW_LAPSE CST_LAPSE CST
HNW::cst_lapse = 0.0005 frac
PSUM::algorithms = IDW_LAPSE CST_LAPSE CST
PSUM::cst_lapse = 0.0005 frac
VW::algorithms = IDW_LAPSE CST
......
......@@ -222,6 +222,13 @@ void Config::parseFile(const std::string& filename)
addFile(file_name);
import_after.pop_back();
}
//HACK: since HNW is now obsolete, check for keys related to HNW to warn the user
for (map<string,string>::const_iterator it=properties.begin(); it != properties.end(); ++it) {
const size_t found_obsoleteHNW = (it->first).find("HNW", 0);
if (found_obsoleteHNW!=string::npos)
throw InvalidArgumentException("Parameter name \"HNW\" has been replaced by \"PSUM\". Please update your ini file!", AT);
}
}
void Config::parseLine(const unsigned int& linenr, std::vector<std::string> &import_after, bool &accept_import_before, std::string &line, std::string &section)
......
......@@ -208,7 +208,7 @@ void DataGenerator::createParameters(std::vector<METEO_SET>& vecVecMeteo) const
/** @brief build the generators for each meteo parameter
* By reading the Config object build up a list of user configured algorithms
* for each MeteoData::Parameters parameter (i.e. each member variable of MeteoData like ta, p, hnw, ...)
* for each MeteoData::Parameters parameter (i.e. each member variable of MeteoData like ta, p, psum, ...)
* Concept of this constructor: loop over all MeteoData::Parameters and then look
* for configuration of interpolation algorithms within the Config object.
* @param[in] cfg configuration object to use for getting the algorithms configuration
......
......@@ -19,7 +19,7 @@
#include <meteoio/MathOptim.h>
#include <meteoio/meteoLaws/Atmosphere.h>
#include <meteoio/meteoLaws/Meteoconst.h>
#include <meteoio/meteoFilters/ProcHNWDistribute.h> //for the precipitation distribution
#include <meteoio/meteoFilters/ProcPSUMDistribute.h> //for the precipitation distribution
#include <algorithm>
......@@ -685,12 +685,12 @@ bool ESOLIPGenerator::generate(const size_t& /*param*/, MeteoData& /*md*/)
return false; //all missing values could be filled
}
//when we can not guarantee HNW=0, we leave it at nodata. Therefore, it is highly recommended to
//when we can not guarantee PSUM=0, we leave it at nodata. Therefore, it is highly recommended to
//run through a Cst=0 data generator afterward
bool ESOLIPGenerator::generate(const size_t& param, std::vector<MeteoData>& vecMeteo)
{
if (param!=MeteoData::HNW)
throw InvalidArgumentException("Trying to use "+algo+" generator on " + MeteoData::getParameterName(param) + " but it can only be applied to HNW!!", AT);
if (param!=MeteoData::PSUM)
throw InvalidArgumentException("Trying to use "+algo+" generator on " + MeteoData::getParameterName(param) + " but it can only be applied to PSUM!!", AT);
if (vecMeteo.empty()) return true;
......@@ -718,7 +718,7 @@ bool ESOLIPGenerator::generate(const size_t& param, std::vector<MeteoData>& vecM
if (HS_delta>0.) {
const double rho = newSnowDensity(vecMeteo[ii]);
const double precip = HS_delta * rho; //in kg/m2 or mm
ProcHNWDistribute::SmartDistributeHNW(precip, start_idx, ii, param, vecMeteo);
ProcPSUMDistribute::SmartDistributePSUM(precip, start_idx, ii, param, vecMeteo);
} else {
all_filled = false;
}
......
......@@ -400,7 +400,7 @@ class AllSkySWGenerator : public GeneratorAlgorithm {
* @note only identified precipitation events are written out, this means that it is recommended to run through a Cst=0 data generator afterward
*
* @code
* HNW::generators = ESOLIP
* PSUM::generators = ESOLIP
* @endcode
*/
class ESOLIPGenerator : public GeneratorAlgorithm {
......
......@@ -159,7 +159,7 @@ namespace mio {
* per line followed by a space delimited list of \ref meteoparam "meteorological parameters" to keep for the station).
*
* @code
* WFJ2::EXCLUDE = HS HNW ;inline declaration of parameters exclusion
* WFJ2::EXCLUDE = HS PSUM ;inline declaration of parameters exclusion
* KLO3::KEEP = TA RH VW DW ;inline declaration of parameters to keep
*
* EXCLUDE_FILE = ../input/meteo/excludes.csv ;parameters exclusions defined in a separate file
......@@ -169,7 +169,7 @@ namespace mio {
* In the second example (relying on a separate file), the file "../input/meteo/excludes.csv" could look like this:
* @code
* WFJ2 TA RH
* KLO3 HS HNW
* KLO3 HS PSUM
* @endcode
*
*/
......
......@@ -63,8 +63,8 @@ InterpolationAlgorithm* AlgorithmFactory::getAlgorithm(const std::string& i_algo
return new LapseOrdinaryKrigingAlgorithm(i_mi, i_vecArgs, i_algoname, tsm, gdm);
} else if (algoname == "USER"){// read user provided grid
return new USERInterpolation(i_mi, i_vecArgs, i_algoname, tsm, gdm);
} else if (algoname == "HNW_SNOW"){// precipitation interpolation according to (Magnusson, 2010)
return new SnowHNWInterpolation(i_mi, i_vecArgs, i_algoname, tsm, gdm);
} else if (algoname == "PSUM_SNOW"){// precipitation interpolation according to (Magnusson, 2010)
return new SnowPSUMInterpolation(i_mi, i_vecArgs, i_algoname, tsm, gdm);
} else {
throw IOException("The interpolation algorithm '"+algoname+"' is not implemented" , AT);
}
......@@ -742,8 +742,8 @@ WinstralAlgorithm::WinstralAlgorithm(Meteo2DInterpolator& i_mi, const std::vecto
double WinstralAlgorithm::getQualityRating(const Date& i_date, const MeteoData::Parameters& in_param)
{
//This algorithm is only valid for HNW (we could add HS later)
if (in_param!=MeteoData::HNW)
//This algorithm is only valid for PSUM (we could add HS later)
if (in_param!=MeteoData::PSUM)
return 0.0;
date = i_date;
......@@ -972,7 +972,7 @@ void USERInterpolation::calculate(const DEMObject& dem, Grid2DObject& grid)
}
double SnowHNWInterpolation::getQualityRating(const Date& i_date, const MeteoData::Parameters& in_param)
double SnowPSUMInterpolation::getQualityRating(const Date& i_date, const MeteoData::Parameters& in_param)
{
date = i_date;
param = in_param;
......@@ -984,7 +984,7 @@ double SnowHNWInterpolation::getQualityRating(const Date& i_date, const MeteoDat
return 0.9;
}
void SnowHNWInterpolation::calculate(const DEMObject& dem, Grid2DObject& grid)
void SnowPSUMInterpolation::calculate(const DEMObject& dem, Grid2DObject& grid)
{
info.clear(); info.str("");
......
......@@ -65,9 +65,9 @@ class Meteo2DInterpolator; // forward declaration, cyclic header include
*
* RH::algorithms = RH IDW_LAPSE CST_LAPSE CST
*
* HNW::algorithms = HNW_SNOW IDW_LAPSE CST_LAPSE CST
* HNW::hnw_snow = cst_lapse
* HNW::cst_lapse = 0.0005 frac
* PSUM::algorithms = PSUM_SNOW IDW_LAPSE CST_LAPSE CST
* PSUM::psum_snow = cst_lapse
* PSUM::cst_lapse = 0.0005 frac
*
* VW::algorithms = IDW_LAPSE CST_LAPSE
*
......@@ -88,7 +88,7 @@ class Meteo2DInterpolator; // forward declaration, cyclic header include
* - LISTON_WIND: the wind field (VW and DW) is interpolated using IDW_LAPSE and then altered depending on the local curvature and slope (taken from the DEM, see ListonWindAlgorithm)
* - RYAN: the wind direction is interpolated using IDW and then altered depending on the local slope (see RyanAlgorithm)
* - WINSTRAL: the solid precipitation is redistributed by wind according to (Winstral, 2002) (see WinstralAlgorithm)
* - HNW_SNOW: precipitation interpolation according to (Magnusson, 2011) (see SnowHNWInterpolation)
* - PSUM_SNOW: precipitation interpolation according to (Magnusson, 2011) (see SnowPSUMInterpolation)
* - ODKRIG: ordinary kriging (see OrdinaryKrigingAlgorithm)
* - ODKRIG_LAPSE: ordinary kriging with lapse rate (see LapseOrdinaryKrigingAlgorithm)
* - USER: user provided grids to be read from disk (if available, see USERInterpolation)
......@@ -215,8 +215,8 @@ class NoneAlgorithm : public InterpolationAlgorithm {
* Optionally, it is also possible to provide the constant that should be used if no measurements
* are avaiblable.
* @code
* HNW::algorithms = CST
* HNW::cst = 0.
* PSUM::algorithms = CST
* PSUM::cst = 0.
* @endcode
*/
class ConstAlgorithm : public InterpolationAlgorithm {
......@@ -447,8 +447,8 @@ class RyanAlgorithm : public InterpolationAlgorithm {
*
* @remarks Only cells with an air temperature below freezing participate in the redistribution
* @code
* HNW::algorithms = WINSTRAL
* HNW::winstral = idw_lapse 180
* PSUM::algorithms = WINSTRAL
* PSUM::winstral = idw_lapse 180
* @endcode
*/
class WinstralAlgorithm : public InterpolationAlgorithm {
......@@ -501,7 +501,7 @@ class USERInterpolation : public InterpolationAlgorithm {
};
/**
* @class SnowHNWInterpolation
* @class SnowPSUMInterpolation
* @brief Precipitation distribution according to the local slope and curvature.
* The precipitation distribution is initialized using a specified algorithm (IDW_LAPSE by default, see IDWLapseAlgorithm).
* An optional parameter can be given to specify which algorithm has to be used for initializing the grid.
......@@ -514,16 +514,16 @@ class USERInterpolation : public InterpolationAlgorithm {
*
* An example using this algorithm, initializing the grid with a constant lapse rate fill using +0.05% precipitation increase per meter of elevation, is given below:
* @code
* HNW::algorithms = HNW_SNOW
* HNW::hnw_snow = cst_lapse
* HNW::cst_lapse = 0.0005 frac
* PSUM::algorithms = PSUM_SNOW
* PSUM::psum_snow = cst_lapse
* PSUM::cst_lapse = 0.0005 frac
* @endcode
*
* @author Florian Kobierska, Jan Magnusson and Mathias Bavay
*/
class SnowHNWInterpolation : public InterpolationAlgorithm {
class SnowPSUMInterpolation : public InterpolationAlgorithm {
public:
SnowHNWInterpolation(Meteo2DInterpolator& i_mi,
SnowPSUMInterpolation(Meteo2DInterpolator& i_mi,
const std::vector<std::string>& i_vecArgs,
const std::string& i_algo, TimeSeriesManager& i_tsmanager, GridsManager& i_gridsmanager)
: InterpolationAlgorithm(i_mi, i_vecArgs, i_algo, i_tsmanager, i_gridsmanager) {}
......
......@@ -323,7 +323,7 @@ namespace mio {
* that is developed). Templates header and code files are available to get you started, look into the "meteoFilters" subdirectory of the source directory (files "template.cc" and "template.h").
*
* It is important to understand that the processing elements operate on a "per parameter" basis.
* This means that an element might be executed for the parameter TA and another one for the parameter HNW, so the
* This means that an element might be executed for the parameter TA and another one for the parameter PSUM, so the
* algorithm only has to deal with a generic processing method based on double values.
*
* To implement a new processing element, the following steps are necessary:
......@@ -383,7 +383,7 @@ namespace mio {
* @endcode
* Which will replace any value greater than 280 Kelvin by 260 Kelvin.
*
* Another good example is the FilterUnheatedHNW that uses a combination of several meteorological parameters to filter the
* Another good example is the FilterUnheatedPSUM that uses a combination of several meteorological parameters to filter the
* precipitation.
*/
......
......@@ -32,7 +32,7 @@ Meteo1DInterpolator::Meteo1DInterpolator(const Config& in_cfg)
window_size /= 86400.; //user uses seconds, internally julian day is used
//read the Config object to create the resampling algorithms for each
//MeteoData::Parameters parameter (i.e. each member variable like ta, p, hnw, ...)
//MeteoData::Parameters parameter (i.e. each member variable like ta, p, psum, ...)
for (size_t ii=0; ii<MeteoData::nrOfParameters; ii++){ //loop over all MeteoData member variables
const std::string parname = MeteoData::getParameterName(ii); //Current parameter name
vector<string> vecArgs;
......
......@@ -50,7 +50,7 @@ Meteo2DInterpolator::~Meteo2DInterpolator()
}
/* By reading the Config object build up a list of user configured algorithms
* for each MeteoData::Parameters parameter (i.e. each member variable of MeteoData like ta, p, hnw, ...)
* for each MeteoData::Parameters parameter (i.e. each member variable of MeteoData like ta, p, psum, ...)
* Concept of this constructor: loop over all MeteoData::Parameters and then look
* for configuration of interpolation algorithms within the Config object.
*/
......@@ -143,10 +143,10 @@ void Meteo2DInterpolator::interpolate(const Date& date, const DEMObject& dem, co
vecAlgs[bestalgorithm]->calculate(dem, result);
InfoString = vecAlgs[bestalgorithm]->getInfo();
//Run soft min/max filter for RH, HNW and HS
//Run soft min/max filter for RH, PSUM and HS
if (meteoparam == MeteoData::RH){
Meteo2DInterpolator::checkMinMax(0.0, 1.0, result);
} else if (meteoparam == MeteoData::HNW){
} else if (meteoparam == MeteoData::PSUM){
Meteo2DInterpolator::checkMinMax(0.0, 10000.0, result);
} else if (meteoparam == MeteoData::HS){
Meteo2DInterpolator::checkMinMax(0.0, 10000.0, result);
......
......@@ -20,7 +20,7 @@
#include <meteoio/meteoLaws/Atmosphere.h>
#include <meteoio/meteoLaws/Sun.h>
#include <meteoio/meteoStats/libinterpol1D.h>
#include <meteoio/meteoFilters/ProcHNWDistribute.h> //for the precipitation distribution
#include <meteoio/meteoFilters/ProcPSUMDistribute.h> //for the precipitation distribution
#include <cmath>
#include <algorithm>
......@@ -451,7 +451,7 @@ Accumulate::Accumulate(const std::string& i_algoname, const std::string& i_parna
for (size_t ii=0; ii<nr_args; ii++) {
if (IOUtils::isNumeric(vecArgs[ii])) {
if (period_read==true)
throw InvalidArgumentException("Two arguments "+i_algoname+" resampling has been deprecated! Please use the \"HNW_Distribute\" Processing Element instead!", AT);
throw InvalidArgumentException("Two arguments "+i_algoname+" resampling has been deprecated! Please use the \"PSUM_Distribute\" Processing Element instead!", AT);
IOUtils::convertString(accumulate_period, vecArgs[ii]);
accumulate_period /= 86400.; //user uses seconds, internally julian day is used
......
......@@ -53,8 +53,8 @@ namespace mio {
* VW::resample = n_neighbor
* VW::n_neighbor = extrapolate
*
* HNW::resample = accumulate
* HNW::accumulate = 3600
* PSUM::resample = accumulate
* PSUM::accumulate = 3600
* @endcode
*
* Most of the resampling algorithms allow you to define per-meteo parameter and per-algorithm the WINDOW_SIZE. Otherwise, the section's WINDOW_SIZE is
......@@ -205,8 +205,8 @@ class LinearResampling : public ResamplingAlgorithms {
* - the accumulation period has to be provided as an argument (in seconds)
* - if giving the argument "strict", nodatas will propagate (ie. a single nodata in the input will force the re-accumulated value to be nodata). By default, all valid values are aggregated and only pure nodata intervals produce a nodata in the output.
* @code
* HNW::resample = accumulate
* HNW::accumulate = 3600
* PSUM::resample = accumulate
* PSUM::accumulate = 3600
* @endcode
*/
class Accumulate : public ResamplingAlgorithms {
......
......@@ -48,9 +48,10 @@ bool MeteoGrids::initStaticData()
paramname.push_back("ILWR");
paramname.push_back("TAU_CLD");
paramname.push_back("HS");
paramname.push_back("HNW");
paramname.push_back("HNW_S");
paramname.push_back("HNW_L");
paramname.push_back("PSUM");
paramname.push_back("PSUM_PH");
paramname.push_back("PSUM_L");
paramname.push_back("PSUM_S");
paramname.push_back("TSG");
paramname.push_back("TSS");
paramname.push_back("P");
......@@ -102,7 +103,7 @@ bool MeteoData::initStaticData()
static_meteoparamname[ISWR] = "ISWR";
static_meteoparamname[ILWR] = "ILWR";
static_meteoparamname[TAU_CLD]= "TAU_CLD";
static_meteoparamname[HNW] = "HNW";
static_meteoparamname[PSUM] = "PSUM";
s_default_paramname.push_back("P");
s_default_paramname.push_back("TA");
......@@ -117,7 +118,7 @@ bool MeteoData::initStaticData()
s_default_paramname.push_back("ISWR");
s_default_paramname.push_back("ILWR");
s_default_paramname.push_back("TAU_CLD");
s_default_paramname.push_back("HNW");
s_default_paramname.push_back("PSUM");
return true;
}
......
......@@ -60,9 +60,10 @@ class MeteoGrids {
ILWR, ///< Incoming long wave radiation
TAU_CLD, ///< Cloud transmissivity or ISWR/ISWR_clear_sky
HS, ///< Height of snow
HNW, ///< Water equivalent of precipitations, either solid or liquid
HNW_S, ///< Water equivalent of precipitations, solid
HNW_L, ///< Water equivalent of precipitations, liquid
PSUM, ///< Water equivalent of precipitations, either solid or liquid
PSUM_PH, ///< Precipitation phase, between 0 (fully solid) and 1 (fully liquid)
PSUM_L, ///< Water equivalent of liquid precipitation
PSUM_S, ///< Water equivalent of solid precipitation
TSG, ///< Temperature ground surface
TSS, ///< Temperature snow surface
P, ///< Air pressure
......@@ -115,8 +116,8 @@ class MeteoData {
ISWR, ///< Incoming short wave radiation
ILWR, ///< Incoming long wave radiation (downwelling)
TAU_CLD, ///< Cloud transmissivity or ISWR/ISWR_clear_sky
HNW, ///< Water equivalent (water depth) of precipitations, either solid or liquid
lastparam=HNW};
PSUM, ///< Water equivalent of precipitations, either solid or liquid
lastparam=PSUM};
static const std::string& getParameterName(const size_t& parindex);
......
......@@ -46,7 +46,7 @@ IOInterface* DEMLoader::generateIOInterface(
cfg.addKey("TA::algorithms", "Interpolations2D", "IDW_LAPSE CST_LAPSE");
cfg.addKey("TA::cst_lapse", "Interpolations2D", "-0.008");
cfg.addKey("RH::algorithms", "Interpolations2D", "RH IDW_LAPSE CST");
cfg.addKey("HNW::algorithms", "Interpolations2D", "IDW_LAPSE CST");
cfg.addKey("PSUM::algorithms", "Interpolations2D", "IDW_LAPSE CST");
cfg.addKey("VW::algorithms", "Interpolations2D", "IDW_LAPSE CST");
cfg.addKey("DW::algorithms", "Interpolations2D", "IDW CST");
cfg.addKey("P::algorithms", "Interpolations2D", "STD_PRESS");
......
......@@ -42,15 +42,15 @@ void loadMeteoAndStationData(double* cMetadata, double* cData,
vecStation.push_back(station);
//building MeteoData
double p=IOUtils::nodata, hnw=IOUtils::nodata, ta=IOUtils::nodata, rh=IOUtils::nodata;
double p=IOUtils::nodata, psum=IOUtils::nodata, ta=IOUtils::nodata, rh=IOUtils::nodata;
double vw=IOUtils::nodata, dw=IOUtils::nodata, iswr=IOUtils::nodata, ilwr=IOUtils::nodata;
double tsg=IOUtils::nodata, tss=IOUtils::nodata, hs=IOUtils::nodata, rswr=IOUtils::nodata;
if(algorithm =="P"){
interpolation_type=MeteoData::P;
p=cData[nbDataPerStation*i];
} else if(algorithm =="HNW" ){
interpolation_type=MeteoData::HNW;
hnw=cData[nbDataPerStation*i];
} else if(algorithm =="PSUM" ){
interpolation_type=MeteoData::PSUM;
psum=cData[nbDataPerStation*i];
} else if(algorithm =="TA" ){
interpolation_type=MeteoData::TA;
ta=cData[nbDataPerStation*i];
......@@ -81,7 +81,7 @@ void loadMeteoAndStationData(double* cMetadata, double* cData,
meteo(MeteoData::DW) = dw;
meteo(MeteoData::RH) = rh;
meteo(MeteoData::ILWR) = ilwr;
meteo(MeteoData::HNW) = hnw;
meteo(MeteoData::PSUM) = psum;
meteo(MeteoData::TSG) = tsg;
meteo(MeteoData::TSS) = tss;
meteo(MeteoData::HS) = hs;
......
......@@ -12,11 +12,11 @@ SET(meteoFilters_sources
meteoFilters/FilterStdDev.cc
meteoFilters/FilterTukey.cc
meteoFilters/FilterRate.cc
meteoFilters/FilterUnheatedHNW.cc
meteoFilters/FilterUnheatedPSUM.cc
meteoFilters/ProcButterworth.cc
meteoFilters/ProcUnventilatedT.cc
meteoFilters/ProcUnshade.cc
meteoFilters/ProcHNWDistribute.cc
meteoFilters/ProcPSUMDistribute.cc
meteoFilters/ProcUndercatch_WMO.cc
meteoFilters/ProcUndercatch_Hamon.cc
meteoFilters/ProcUndercatch_Forland.cc
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment