Merge remote-tracking branch 'origin/develop' into feature/ECC-1909-model-name-version-extension

This commit is contained in:
Matthew Griffith 2024-11-12 17:20:27 +00:00
commit ea018368dd
77 changed files with 4258 additions and 3912 deletions

View File

@ -13,6 +13,7 @@ string(REGEX REPLACE "\n" ";" bufr_refs_to_download "${bufr_refs_to_download}")
# Exceptional case: download bufr files which have to be treated specially
list(APPEND bufr_files_to_download "vos308014_v3_26.bufr") # See test ecc-197
list(APPEND bufr_files_to_download "bad.bufr") # See ECC-1938
if( ENABLE_EXTRA_TESTS )
ecbuild_get_test_multidata(

View File

@ -23,7 +23,7 @@ my $dbh = DBI->connect("dbi:mysql(RaiseError=>1):database=$db;host=$host",$user
#my $tarfilesflag = 0;
sub create_cfName {
my $p; my %seen;
my $p; my %seen;
my ($key) = "cfName";
my $field = "cf.name";
@ -33,6 +33,7 @@ sub create_cfName {
param,grib_encoding,grib,attribute,centre,units,cf where
param.hide_def=0 and
param.retired=0 and
grib_encoding.published=1 and
grib_encoding.id=grib.encoding_id and
param.id=grib_encoding.param_id and
attribute.id=grib.attribute_id and
@ -46,7 +47,7 @@ EOF
my $qh=$dbh->prepare($query);
$qh->execute();
# file containing the list of grib api parameters files we want to tar and
# file containing the list of grib api parameters files we want to tar and
# distribute to users for them to download and update their list of parameter
# to the latest
#open(TAR,$tarfilesflag ? ">>" : ">","tarfiles.txt") or die "Count not open file tarfiles.txt: $!";
@ -81,7 +82,7 @@ EOF
}
$seen{$attribute}=1;
print "($key=$keyval) $edition,$centre,$shortName,$paramId,$name,$attribute,$value\n";
# we need to allow strings in the attribute_value field
# we need to allow strings in the attribute_value field
# for the moment we apply a patch here
if ($attribute =~ /stepType/ ) {
$value="\"accum\"";
@ -100,7 +101,7 @@ EOF
}
sub create_cfName_legacy {
my $p; my %seen;
my $p; my %seen;
my ($key) = "cfName";
my $field = "cf.name";
@ -123,7 +124,7 @@ EOF
my $qh=$dbh->prepare($query);
$qh->execute();
# file containing the list of grib api parameters files we want to tar and
# file containing the list of grib api parameters files we want to tar and
# distribute to users for them to download and update their list of parameter
# to the latest
#open(TAR,$tarfilesflag ? ">>" : ">","tarfiles.txt") or die "Count not open file tarfiles.txt: $!";
@ -158,7 +159,7 @@ EOF
}
$seen{$attribute}=1;
print "($key=$keyval) $edition,$centre,$shortName,$paramId,$name,$attribute,$value\n";
# we need to allow strings in the attribute_value field
# we need to allow strings in the attribute_value field
# for the moment we apply a patch here
if ($attribute =~ /stepType/ ) {
$value="\"accum\"";
@ -177,13 +178,13 @@ EOF
}
sub create_def {
my $p; my %seen;
my $p; my %seen;
my ($key) =@_;
my $field=$key;
if ($key =~ /paramId/) { $field="param.id"; }
if ($key =~ /name/) { $field="param.name"; }
if ($key =~ /units/) { $field="units.name"; }
if ($key =~ /paramId/) { $field="param.id"; }
if ($key =~ /name/) { $field="param.name"; }
if ($key =~ /units/) { $field="units.name"; }
my $query= <<"EOF";
select $field,force128,edition,
@ -191,6 +192,7 @@ sub create_def {
from param,grib_encoding,grib,attribute,centre,units where
param.hide_def=0 and
param.retired=0 and
grib_encoding.published=1 and
grib_encoding.id=grib.encoding_id and
param.id=grib_encoding.param_id and
attribute.id=grib.attribute_id and
@ -203,7 +205,7 @@ EOF
my $qh=$dbh->prepare($query);
$qh->execute();
# file containing the list of grib api parameters files we want to tar and
# file containing the list of grib api parameters files we want to tar and
# distribute to users for them to download and update their list of parameter
# to the latest
#open(TAR,$tarfilesflag ? ">>" : ">","tarfiles.txt") or die "Count not open file tarfiles.txt: $!";
@ -223,9 +225,9 @@ EOF
close $out;
}
$filebase="$basedir/grib$edition$conceptDir";
mkpath($filebase);
mkpath($filebase);
#copy("$filebase/$key.def","$filebase/$key.def.bkp")
#copy("$filebase/$key.def","$filebase/$key.def.bkp")
# or die ("unable to copy $filebase/$key.def");
print TAR "grib$edition$conceptDir/$key.def\n";
@ -244,7 +246,7 @@ EOF
}
$seen{$attribute}=1;
print "($key=$keyval) $edition,$centre,$shortName,$paramId,$name,$attribute,$value\n";
# we need to allow strings in the attribute_value field
# we need to allow strings in the attribute_value field
# for the moment we apply a patch here
if ($attribute =~ /stepType/ ) {
$value="\"accum\"";
@ -263,13 +265,13 @@ EOF
}
sub create_def_legacy {
my $p; my %seen;
my $p; my %seen;
my ($key) =@_;
my $field=$key;
if ($key =~ /paramId/) { $field="param.id"; }
if ($key =~ /name/) { $field="param.name"; }
if ($key =~ /units/) { $field="units.name"; }
if ($key =~ /paramId/) { $field="param.id"; }
if ($key =~ /name/) { $field="param.name"; }
if ($key =~ /units/) { $field="units.name"; }
my $query= <<"EOF";
select $field,force128,edition,
@ -289,7 +291,7 @@ EOF
my $qh=$dbh->prepare($query);
$qh->execute();
# file containing the list of grib api parameters files we want to tar and
# file containing the list of grib api parameters files we want to tar and
# distribute to users for them to download and update their list of parameter
# to the latest
#open(TAR,$tarfilesflag ? ">>" : ">","tarfiles.txt") or die "Count not open file tarfiles.txt: $!";
@ -309,9 +311,9 @@ EOF
close $out;
}
$filebase="$basedir/grib$edition$conceptDir";
mkpath($filebase);
mkpath($filebase);
#copy("$filebase/$key.def","$filebase/$key.def.bkp")
#copy("$filebase/$key.def","$filebase/$key.def.bkp")
# or die ("unable to copy $filebase/$key.def");
print TAR "grib$edition$conceptDir/$key.legacy.def\n";
@ -330,7 +332,7 @@ EOF
}
$seen{$attribute}=1;
print "($key=$keyval) $edition,$centre,$shortName,$paramId,$name,$attribute,$value\n";
# we need to allow strings in the attribute_value field
# we need to allow strings in the attribute_value field
# for the moment we apply a patch here
if ($attribute =~ /stepType/ ) {
$value="\"accum\"";
@ -347,14 +349,101 @@ EOF
close(TAR);
}
sub create_cfVarName {
my $p; my %seen;
my ($key) =@_;
my $field=$key;
#if ($key =~ /paramId/) { $field="param.id"; }
#if ($key =~ /name/) { $field="param.name"; }
#if ($key =~ /units/) { $field="units.name"; }
if ($key =~ /cfVarName/) { $field="cfVarName"; }
my $query= <<"EOF";
select $field,force128,edition,
centre.abbreviation,param_id,attribute.name,attribute_value,param.name,param.shortName
from param,grib_encoding,grib,attribute,centre,units where
param.hide_def=0 and
grib_encoding.id=grib.encoding_id and
param.id=grib_encoding.param_id and
attribute.id=grib.attribute_id and
centre.id=grib_encoding.centre_id and
units.id=param.units_id
and cfVarName IS NOT NULL
order by edition,centre_id,param.o,param.id,grib_encoding.param_version,attribute.o;
EOF
my $qh=$dbh->prepare($query);
$qh->execute();
# file containing the list of grib api parameters files we want to tar and
# distribute to users for them to download and update their list of parameter
# to the latest
#open(TAR,$tarfilesflag ? ">>" : ">","tarfiles.txt") or die "Count not open file tarfiles.txt: $!";
#$tarfilesflag=1;
while (my ($keyval,$force128,$edition,$centre,$paramId,$attribute,$value,$name,$shortName)=$qh->fetchrow_array )
{
if ($centre eq "wmo" ) { $conceptDir=""; }
else { $conceptDir="/localConcepts/$centre"; }
#if ($key =~ /paramId/ && $force128==1 && $keyval >1000) {
# $keyval= $keyval % 1000;
#}
if ($filebase ne "$basedir/grib$edition$conceptDir") {
if ($filebase) {
print $out "}\n";
close $out;
}
$filebase="$basedir/grib$edition$conceptDir";
mkpath($filebase);
#copy("$filebase/$key.def","$filebase/$key.def.bkp")
# or die ("unable to copy $filebase/$key.def");
print TAR "grib$edition$conceptDir/$key.def\n";
#system("cp -f $filebase/$key.def $filebase/$key.def.orig");
open($out,"> $filebase/$key.def")
or die "unable to open $filebase/$key.def";
print $out "# Automatically generated by $0, do not edit\n";
$p=();
}
if ($p ne $paramId || exists($seen{$attribute}) ) {
if ($p) { print $out "\t}\n"; }
print $out "#$name\n" ;
print $out "\'".$keyval."\' = {\n" ;
$p=$paramId;
%seen=();
}
$seen{$attribute}=1;
print "($key=$keyval) $edition,$centre,$shortName,$paramId,$name,$attribute,$value\n";
# we need to allow strings in the attribute_value field
# for the moment we apply a patch here
if ($attribute =~ /stepType/ ) {
$value="\"accum\"";
}
if ($value eq '') {
$value="missing()";
}
print $out "\t $attribute = $value ;\n" ;
}
if ($filebase) {
print $out "}\n";
close $out;
}
close(TAR);
}
sub create_paramId_def {
my $p; my %seen;
my $p; my %seen;
my $query="select edition,centre.abbreviation,param_id,attribute.name,attribute_value,param.name,param.shortName
from param,grib_encoding,grib,attribute,centre where
param.hide_def=0 and
param.retired=0 and
grib_encoding.published=1 and
grib_encoding.id=grib.encoding_id and
param.id=grib_encoding.param_id and
attribute.id=grib.attribute_id and
@ -375,9 +464,9 @@ sub create_paramId_def {
close $out;
}
$filebase="$basedir/grib$edition$conceptDir";
mkpath($filebase);
mkpath($filebase);
copy("$filebase/paramId.def","$filebase/paramId.def.bkp")
copy("$filebase/paramId.def","$filebase/paramId.def.bkp")
or die ("unable to copy $filebase/paramId.def");
open($out,"> $filebase/paramId.def")
or die "unable to open $filebase/paramId.def";
@ -400,7 +489,7 @@ sub create_paramId_def {
close $out;
}
}
sub create_def_old {
my ($key,$query)=@_;
@ -417,9 +506,9 @@ sub create_def_old {
close $out;
}
$filebase="$basedir/grib$edition$conceptDir";
mkpath($filebase);
mkpath($filebase);
copy("$filebase/$key.def","$filebase/$key.def.bkp")
copy("$filebase/$key.def","$filebase/$key.def.bkp")
or die ("unable to copy $filebase/$key.def");
open($out,"> $filebase/$key.def")
or die "unable to open $filebase/$key.def";
@ -440,35 +529,36 @@ create_def("name");
create_def_legacy("name");
create_def("units");
create_def_legacy("units");
create_cfVarName("cfVarName");
create_cfName("cfName");
create_cfName_legacy("cfName");
# #create_paramId_def();
# $query="select distinct edition,centre.abbreviation,param_id,param.shortName from param,grib_encoding,centre where
# param.hide_def=0 and
# param.id=grib_encoding.param_id and
# centre.id=grib_encoding.centre_id and
# param.hide_def=0 and
# param.id=grib_encoding.param_id and
# centre.id=grib_encoding.centre_id and
# shortName!='~' order by abbreviation,edition,param.o,param.id,shortName";
# #select distinct edition,centre.abbreviation,param_id,param.shortName
# #from param,grib_encoding,grib,centre where param.hide_def=0 and param.id=grib.param_id and
# #centre.id=grib_encoding.centre_id and shortName!='~'
# #select distinct edition,centre.abbreviation,param_id,param.shortName
# #from param,grib_encoding,grib,centre where param.hide_def=0 and param.id=grib.param_id and
# #centre.id=grib_encoding.centre_id and shortName!='~'
# #order by centre,edition,param.o,param_id";
# #create_def("shortName",$query);
# $query="select distinct edition,centre.abbreviation,param_id,param.name
# from param,grib,centre where param.hide_def=0 and param.id=grib.param_id and
# centre.id=grib.centre and shortName!='~'
# $query="select distinct edition,centre.abbreviation,param_id,param.name
# from param,grib,centre where param.hide_def=0 and param.id=grib.param_id and
# centre.id=grib.centre and shortName!='~'
# order by centre,edition,param.o,param_id";
# #create_def("name",$query);
# $query="select distinct edition,centre.abbreviation,param_id,units.name
# $query="select distinct edition,centre.abbreviation,param_id,units.name
# from param,grib,centre,units where param.hide_def=0 and param.id=grib.param_id and units.id=param.units_id
# and centre.id=grib.centre and shortName!='~'
# and centre.id=grib.centre and shortName!='~'
# order by centre,edition,param.o,param_id";
# #create_def("units",$query);

View File

@ -29,7 +29,7 @@ transient hourOfEndOfOverallTimeInterval=23;
transient minuteOfEndOfOverallTimeInterval=59;
transient secondOfEndOfOverallTimeInterval=59;
transient indicatorOfUnitForTimeRange=3;
transient indicatorOfUnitForTimeRange=3; # month
transient lengthOfTimeRange=1;
unsigned[1] averagingPeriod : dump ;

View File

@ -189,6 +189,11 @@
table2Version = 171 ;
indicatorOfParameter = 7 ;
}
#100 metre wind speed anomaly
'sia100' = {
table2Version = 171 ;
indicatorOfParameter = 8 ;
}
#2 metre specific humidity
'sh2' = {
table2Version = 174 ;

View File

@ -3774,6 +3774,11 @@
table2Version = 171 ;
indicatorOfParameter = 7 ;
}
#100 metre wind speed anomaly
'100 metre wind speed anomaly' = {
table2Version = 171 ;
indicatorOfParameter = 8 ;
}
#Lake mix-layer temperature anomaly
'Lake mix-layer temperature anomaly' = {
table2Version = 171 ;

View File

@ -3774,6 +3774,11 @@
table2Version = 171 ;
indicatorOfParameter = 7 ;
}
#100 metre wind speed anomaly
'171008' = {
table2Version = 171 ;
indicatorOfParameter = 8 ;
}
#Lake mix-layer temperature anomaly
'171024' = {
table2Version = 171 ;

View File

@ -3774,6 +3774,11 @@
table2Version = 171 ;
indicatorOfParameter = 7 ;
}
#100 metre wind speed anomaly
'100sia' = {
table2Version = 171 ;
indicatorOfParameter = 8 ;
}
#Lake mix-layer temperature anomaly
'lmlta' = {
table2Version = 171 ;

View File

@ -3774,6 +3774,11 @@
table2Version = 171 ;
indicatorOfParameter = 7 ;
}
#100 metre wind speed anomaly
'm s**-1' = {
table2Version = 171 ;
indicatorOfParameter = 8 ;
}
#Lake mix-layer temperature anomaly
'K' = {
table2Version = 171 ;

View File

@ -119,34 +119,6 @@
scaleFactorOfLowerLimit = 0 ;
probabilityType = 3 ;
}
#Time-mean 2D wave spectra (single)
'avg_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-maximum 2D wave spectra (single)
'max_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-minimum 2D wave spectra (single)
'min_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-standard-deviation 2D wave spectra (single)
'std_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 6 ;
}
#2 metre specific humidity
'sh2' = {
discipline = 0 ;
@ -214,6 +186,26 @@
scaledValueOfFirstFixedSurface = 100 ;
scaleFactorOfFirstFixedSurface = 0 ;
}
#Time-maximum 2 metre relative humidity
'mx2r' = {
discipline = 0 ;
parameterCategory = 1 ;
parameterNumber = 1 ;
typeOfFirstFixedSurface = 103 ;
scaledValueOfFirstFixedSurface = 2 ;
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-minimum 2 metre relative humidity
'mn2r' = {
discipline = 0 ;
parameterCategory = 1 ;
parameterNumber = 1 ;
typeOfFirstFixedSurface = 103 ;
scaledValueOfFirstFixedSurface = 2 ;
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-mean sea ice area fraction
'avg_ci' = {
discipline = 10 ;

View File

@ -17,5 +17,6 @@ alias mars.time = indexingTimeHHMM;
# ECC-1425
meta marsForecastMonth g1forecastmonth(dataDate, forecastTime): read_only;
alias forecastMonth = marsForecastMonth;
pad padding_loc12_1(50);

View File

@ -8,3 +8,4 @@ alias local.methodNumber=methodNumber;
# ECC-1425
meta marsForecastMonth g1forecastmonth(dataDate, forecastTime): read_only;
alias forecastMonth = marsForecastMonth;

View File

@ -1,4 +1,10 @@
# Automatically generated by ./create_def.pl, do not edit
#Sea ice area fraction
'siconc' = {
discipline = 192 ;
parameterCategory = 128 ;
parameterNumber = 31 ;
}
#Maximum temperature at 2 metres in the last 24 hours
'mx2t24' = {
discipline = 0 ;
@ -95,6 +101,18 @@
typeOfStatisticalProcessing = 3 ;
lengthOfTimeRange = 3 ;
}
#Maximum 10 metre wind gust in the last 3 hours
'fg310' = {
discipline = 192 ;
parameterCategory = 228 ;
parameterNumber = 28 ;
}
#100 metre wind speed
'si100' = {
discipline = 192 ;
parameterCategory = 228 ;
parameterNumber = 249 ;
}
#10 metre wind gust gradient
'fggrd10' = {
discipline = 192 ;
@ -343,6 +361,24 @@
parameterCategory = 140 ;
parameterNumber = 250 ;
}
#2D wave spectra (single)
'd2fd' = {
discipline = 192 ;
parameterCategory = 140 ;
parameterNumber = 251 ;
}
#Eastward surface sea water velocity
'uoe' = {
discipline = 192 ;
parameterCategory = 151 ;
parameterNumber = 131 ;
}
#Northward surface sea water velocity
'von' = {
discipline = 192 ;
parameterCategory = 151 ;
parameterNumber = 132 ;
}
#10 metre wind gust during averaging time
'fgrea10' = {
discipline = 192 ;
@ -397,9 +433,33 @@
parameterCategory = 200 ;
parameterNumber = 168 ;
}
#Time-mean 2 metre temperature
'avg_2t' = {
discipline = 192 ;
parameterCategory = 228 ;
parameterNumber = 4 ;
}
#Time-mean 10 metre wind speed
'avg_10ws' = {
discipline = 192 ;
parameterCategory = 228 ;
parameterNumber = 5 ;
}
#2 metre temperature significance
't2s' = {
discipline = 192 ;
parameterCategory = 234 ;
parameterNumber = 167 ;
}
#100 metre U wind component
'u100' = {
discipline = 192 ;
parameterCategory = 228 ;
parameterNumber = 246 ;
}
#100 metre V wind component
'v100' = {
discipline = 192 ;
parameterCategory = 228 ;
parameterNumber = 247 ;
}

View File

@ -497,4 +497,58 @@
parameterNumber = 25 ;
typeOfFirstFixedSurface = 105 ;
typeOfStatisticalProcessing = 0 ;
}
#Snow thickness over sea ice
'Snow thickness over sea ice' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Sea ice salinity
'Sea ice salinity' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Time-mean snow thickness over sea ice
'Time-mean snow thickness over sea ice' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean Sea ice salinity
'Time-mean Sea ice salinity' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}

View File

@ -497,4 +497,58 @@
parameterNumber = 25 ;
typeOfFirstFixedSurface = 105 ;
typeOfStatisticalProcessing = 0 ;
}
#Snow thickness over sea ice
'262002' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Sea ice salinity
'262023' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Time-mean snow thickness over sea ice
'263002' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean Sea ice salinity
'263023' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}

View File

@ -497,4 +497,58 @@
parameterNumber = 25 ;
typeOfFirstFixedSurface = 105 ;
typeOfStatisticalProcessing = 0 ;
}
#Snow thickness over sea ice
'sisnthick' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Sea ice salinity
'icesalt' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Time-mean snow thickness over sea ice
'avg_sisnthick' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean Sea ice salinity
'avg_icesalt' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}

View File

@ -497,4 +497,58 @@
parameterNumber = 25 ;
typeOfFirstFixedSurface = 105 ;
typeOfStatisticalProcessing = 0 ;
}
#Snow thickness over sea ice
'm' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Sea ice salinity
'g kg**-1' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
}
#Time-mean snow thickness over sea ice
'm' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 192 ;
typeOfFirstFixedSurface = 173 ;
typeOfSecondFixedSurface = 175 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean Sea ice salinity
'g kg**-1' = {
localTablesVersion = 1 ;
discipline = 10 ;
parameterCategory = 2 ;
parameterNumber = 193 ;
typeOfFirstFixedSurface = 174 ;
typeOfSecondFixedSurface = 176 ;
scaledValueOfFirstFixedSurface = missing() ;
scaleFactorOfFirstFixedSurface = missing() ;
scaledValueOfSecondFixedSurface = missing() ;
scaleFactorOfSecondFixedSurface = missing() ;
typeOfStatisticalProcessing = 0 ;
}

View File

@ -1269,6 +1269,78 @@
parameterCategory = 0 ;
parameterNumber = 97 ;
}
#Peak wave period of wind waves
'Peak wave period of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
}
#Peak wave period of total swell
'Peak wave period of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
}
#Peak wave period of first swell partition
'Peak wave period of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
}
#Peak wave period of second swell partition
'Peak wave period of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
}
#Peak wave period of third swell partition
'Peak wave period of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
}
#Peak wave direction (total)
'Peak wave direction (total)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
}
#Peak wave direction of wind waves
'Peak wave direction of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
}
#Peak wave direction of total swell
'Peak wave direction of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
}
#Peak wave direction of first swell partition
'Peak wave direction of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
}
#Peak wave direction of second swell partition
'Peak wave direction of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
}
#Peak wave direction of third swell partition
'Peak wave direction of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
}
#Whitecap fraction
'Whitecap fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
}
#Wave Spectral Skewness
'Wave Spectral Skewness' = {
discipline = 10 ;
@ -1421,88 +1493,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'Time-mean significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'Time-mean significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'Time-mean significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'Time-mean significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'Time-mean significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'Time-mean significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-mean significant wave height of all waves with period larger than 10s
'Time-mean significant wave height of all waves with period larger than 10s' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-mean significant wave height of first swell partition
'Time-mean significant wave height of first swell partition' = {
discipline = 10 ;
@ -1594,6 +1584,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of wind waves
'Time-mean peak wave period of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of total swell
'Time-mean peak wave period of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of first swell partition
'Time-mean peak wave period of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of second swell partition
'Time-mean peak wave period of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of third swell partition
'Time-mean peak wave period of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction (total)
'Time-mean peak wave direction (total)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of wind waves
'Time-mean peak wave direction of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of total swell
'Time-mean peak wave direction of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of first swell partition
'Time-mean peak wave direction of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of second swell partition
'Time-mean peak wave direction of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of third swell partition
'Time-mean peak wave direction of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean whitecap fraction
'Time-mean whitecap fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave Spectral Skewness
'Time-mean wave Spectral Skewness' = {
discipline = 10 ;
@ -1831,13 +1905,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean 2D wave spectra (single)
'Time-mean 2D wave spectra (single)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave spectral kurtosis
'Time-mean wave spectral kurtosis' = {
discipline = 10 ;
@ -1975,88 +2042,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'Time-maximum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'Time-maximum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'Time-maximum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'Time-maximum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'Time-maximum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'Time-maximum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-maximum significant wave height of all waves with period larger than 10s
'Time-maximum significant wave height of all waves with period larger than 10s' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-maximum significant wave height of first swell partition
'Time-maximum significant wave height of first swell partition' = {
discipline = 10 ;
@ -2148,6 +2133,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of wind waves
'Time-maximum peak wave period of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of total swell
'Time-maximum peak wave period of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of first swell partition
'Time-maximum peak wave period of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of second swell partition
'Time-maximum peak wave period of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of third swell partition
'Time-maximum peak wave period of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction (total)
'Time-maximum peak wave direction (total)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of wind waves
'Time-maximum peak wave direction of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of total swell
'Time-maximum peak wave direction of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of first swell partition
'Time-maximum peak wave direction of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of second swell partition
'Time-maximum peak wave direction of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of third swell partition
'Time-maximum peak wave direction of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum whitecap fraction
'Time-maximum whitecap fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave Spectral Skewness
'Time-maximum wave Spectral Skewness' = {
discipline = 10 ;
@ -2385,13 +2454,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum 2D wave spectra (single)
'Time-maximum 2D wave spectra (single)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave spectral kurtosis
'Time-maximum wave spectral kurtosis' = {
discipline = 10 ;
@ -2529,88 +2591,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'Time-minimum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'Time-minimum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'Time-minimum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'Time-minimum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'Time-minimum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'Time-minimum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-minimum significant wave height of all waves with period larger than 10s
'Time-minimum significant wave height of all waves with period larger than 10s' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-minimum significant wave height of first swell partition
'Time-minimum significant wave height of first swell partition' = {
discipline = 10 ;
@ -2702,6 +2682,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of wind waves
'Time-minimum peak wave period of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of total swell
'Time-minimum peak wave period of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of first swell partition
'Time-minimum peak wave period of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of second swell partition
'Time-minimum peak wave period of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of third swell partition
'Time-minimum peak wave period of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction (total)
'Time-minimum peak wave direction (total)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of wind waves
'Time-minimum peak wave direction of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of total swell
'Time-minimum peak wave direction of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of first swell partition
'Time-minimum peak wave direction of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of second swell partition
'Time-minimum peak wave direction of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of third swell partition
'Time-minimum peak wave direction of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum whitecap fraction
'Time-minimum whitecap fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave Spectral Skewness
'Time-minimum wave Spectral Skewness' = {
discipline = 10 ;
@ -2939,13 +3003,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum 2D wave spectra (single)
'Time-minimum 2D wave spectra (single)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave spectral kurtosis
'Time-minimum wave spectral kurtosis' = {
discipline = 10 ;
@ -3083,88 +3140,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-standard-deviation significant wave height of all waves with period larger than 10s
'Time-standard-deviation significant wave height of all waves with period larger than 10s' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-standard-deviation significant wave height of first swell partition
'Time-standard-deviation significant wave height of first swell partition' = {
discipline = 10 ;
@ -3256,6 +3231,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of wind waves
'Time-standard-deviation peak wave period of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of total swell
'Time-standard-deviation peak wave period of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of first swell partition
'Time-standard-deviation peak wave period of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of second swell partition
'Time-standard-deviation peak wave period of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of third swell partition
'Time-standard-deviation peak wave period of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction (total)
'Time-standard-deviation peak wave direction (total)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of wind waves
'Time-standard-deviation peak wave direction of wind waves' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of total swell
'Time-standard-deviation peak wave direction of total swell' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of first swell partition
'Time-standard-deviation peak wave direction of first swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of second swell partition
'Time-standard-deviation peak wave direction of second swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of third swell partition
'Time-standard-deviation peak wave direction of third swell partition' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation whitecap fraction
'Time-standard-deviation whitecap fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave Spectral Skewness
'Time-standard-deviation wave Spectral Skewness' = {
discipline = 10 ;
@ -3493,13 +3552,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation 2D wave spectra (single)
'Time-standard-deviation 2D wave spectra (single)' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave spectral kurtosis
'Time-standard-deviation wave spectral kurtosis' = {
discipline = 10 ;
@ -16501,6 +16553,12 @@
parameterCategory = 0 ;
parameterNumber = 32 ;
}
#Wet-bulb temperature
'Wet-bulb temperature' = {
discipline = 0 ;
parameterCategory = 0 ;
parameterNumber = 27 ;
}
#Sea ice thickness
'Sea ice thickness' = {
discipline = 10 ;

View File

@ -1269,6 +1269,78 @@
parameterCategory = 0 ;
parameterNumber = 97 ;
}
#Peak wave period of wind waves
'140135' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
}
#Peak wave period of total swell
'140136' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
}
#Peak wave period of first swell partition
'140137' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
}
#Peak wave period of second swell partition
'140138' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
}
#Peak wave period of third swell partition
'140139' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
}
#Peak wave direction (total)
'140140' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
}
#Peak wave direction of wind waves
'140141' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
}
#Peak wave direction of total swell
'140142' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
}
#Peak wave direction of first swell partition
'140143' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
}
#Peak wave direction of second swell partition
'140144' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
}
#Peak wave direction of third swell partition
'140145' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
}
#Whitecap fraction
'140146' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
}
#Wave Spectral Skewness
'140207' = {
discipline = 10 ;
@ -1421,88 +1493,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'141114' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'141115' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'141116' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'141117' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'141118' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'141119' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-mean significant wave height of all waves with period larger than 10s
'141120' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-mean significant wave height of first swell partition
'141121' = {
discipline = 10 ;
@ -1594,6 +1584,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of wind waves
'141135' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of total swell
'141136' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of first swell partition
'141137' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of second swell partition
'141138' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of third swell partition
'141139' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction (total)
'141140' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of wind waves
'141141' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of total swell
'141142' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of first swell partition
'141143' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of second swell partition
'141144' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of third swell partition
'141145' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean whitecap fraction
'141146' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave Spectral Skewness
'141207' = {
discipline = 10 ;
@ -1831,13 +1905,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean 2D wave spectra (single)
'141251' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave spectral kurtosis
'141252' = {
discipline = 10 ;
@ -1975,88 +2042,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'143114' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'143115' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'143116' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'143117' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'143118' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'143119' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-maximum significant wave height of all waves with period larger than 10s
'143120' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-maximum significant wave height of first swell partition
'143121' = {
discipline = 10 ;
@ -2148,6 +2133,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of wind waves
'143135' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of total swell
'143136' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of first swell partition
'143137' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of second swell partition
'143138' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of third swell partition
'143139' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction (total)
'143140' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of wind waves
'143141' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of total swell
'143142' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of first swell partition
'143143' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of second swell partition
'143144' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of third swell partition
'143145' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum whitecap fraction
'143146' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave Spectral Skewness
'143207' = {
discipline = 10 ;
@ -2385,13 +2454,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum 2D wave spectra (single)
'143251' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave spectral kurtosis
'143252' = {
discipline = 10 ;
@ -2529,88 +2591,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'144114' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'144115' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'144116' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'144117' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'144118' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'144119' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-minimum significant wave height of all waves with period larger than 10s
'144120' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-minimum significant wave height of first swell partition
'144121' = {
discipline = 10 ;
@ -2702,6 +2682,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of wind waves
'144135' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of total swell
'144136' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of first swell partition
'144137' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of second swell partition
'144138' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of third swell partition
'144139' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction (total)
'144140' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of wind waves
'144141' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of total swell
'144142' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of first swell partition
'144143' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of second swell partition
'144144' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of third swell partition
'144145' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum whitecap fraction
'144146' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave Spectral Skewness
'144207' = {
discipline = 10 ;
@ -2939,13 +3003,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum 2D wave spectra (single)
'144251' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave spectral kurtosis
'144252' = {
discipline = 10 ;
@ -3083,88 +3140,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'145114' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'145115' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'145116' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'145117' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'145118' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'145119' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-standard-deviation significant wave height of all waves with period larger than 10s
'145120' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-standard-deviation significant wave height of first swell partition
'145121' = {
discipline = 10 ;
@ -3256,6 +3231,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of wind waves
'145135' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of total swell
'145136' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of first swell partition
'145137' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of second swell partition
'145138' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of third swell partition
'145139' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction (total)
'145140' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of wind waves
'145141' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of total swell
'145142' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of first swell partition
'145143' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of second swell partition
'145144' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of third swell partition
'145145' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation whitecap fraction
'145146' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave Spectral Skewness
'145207' = {
discipline = 10 ;
@ -3493,13 +3552,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation 2D wave spectra (single)
'145251' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave spectral kurtosis
'145252' = {
discipline = 10 ;
@ -16501,6 +16553,12 @@
parameterCategory = 0 ;
parameterNumber = 32 ;
}
#Wet-bulb temperature
'261023' = {
discipline = 0 ;
parameterCategory = 0 ;
parameterNumber = 27 ;
}
#Sea ice thickness
'262000' = {
discipline = 10 ;

View File

@ -1269,6 +1269,78 @@
parameterCategory = 0 ;
parameterNumber = 97 ;
}
#Peak wave period of wind waves
'pp1dw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
}
#Peak wave period of total swell
'pp1ds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
}
#Peak wave period of first swell partition
'pp1d1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
}
#Peak wave period of second swell partition
'pp1d2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
}
#Peak wave period of third swell partition
'pp1d3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
}
#Peak wave direction (total)
'pwd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
}
#Peak wave direction of wind waves
'pwdw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
}
#Peak wave direction of total swell
'pwds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
}
#Peak wave direction of first swell partition
'pwd1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
}
#Peak wave direction of second swell partition
'pwd2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
}
#Peak wave direction of third swell partition
'pwd3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
}
#Whitecap fraction
'wcfr' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
}
#Wave Spectral Skewness
'wss' = {
discipline = 10 ;
@ -1421,88 +1493,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'avg_h1012' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'avg_h1214' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'avg_h1417' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'avg_h1721' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'avg_h2125' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'avg_h2530' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-mean significant wave height of all waves with period larger than 10s
'avg_sh10' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-mean significant wave height of first swell partition
'avg_swh1' = {
discipline = 10 ;
@ -1594,6 +1584,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of wind waves
'avg_pp1dw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of total swell
'avg_pp1ds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of first swell partition
'avg_pp1d1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of second swell partition
'avg_pp1d2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of third swell partition
'avg_pp1d3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction (total)
'avg_pwd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of wind waves
'avg_pwdw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of total swell
'avg_pwds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of first swell partition
'avg_pwd1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of second swell partition
'avg_pwd2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of third swell partition
'avg_pwd3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean whitecap fraction
'avg_wcfr' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave Spectral Skewness
'avg_wss' = {
discipline = 10 ;
@ -1831,13 +1905,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean 2D wave spectra (single)
'avg_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave spectral kurtosis
'avg_wsk' = {
discipline = 10 ;
@ -1975,88 +2042,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'max_h1012' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'max_h1214' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'max_h1417' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'max_h1721' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'max_h2125' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'max_h2530' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-maximum significant wave height of all waves with period larger than 10s
'max_sh10' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-maximum significant wave height of first swell partition
'max_swh1' = {
discipline = 10 ;
@ -2148,6 +2133,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of wind waves
'max_pp1dw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of total swell
'max_pp1ds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of first swell partition
'max_pp1d1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of second swell partition
'max_pp1d2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of third swell partition
'max_pp1d3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction (total)
'max_pwd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of wind waves
'max_pwdw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of total swell
'max_pwds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of first swell partition
'max_pwd1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of second swell partition
'max_pwd2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of third swell partition
'max_pwd3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum whitecap fraction
'max_wcfr' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave Spectral Skewness
'max_wss' = {
discipline = 10 ;
@ -2385,13 +2454,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum 2D wave spectra (single)
'max_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave spectral kurtosis
'max_wsk' = {
discipline = 10 ;
@ -2529,88 +2591,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'min_h1012' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'min_h1214' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'min_h1417' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'min_h1721' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'min_h2125' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'min_h2530' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-minimum significant wave height of all waves with period larger than 10s
'min_sh10' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-minimum significant wave height of first swell partition
'min_swh1' = {
discipline = 10 ;
@ -2702,6 +2682,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of wind waves
'min_pp1dw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of total swell
'min_pp1ds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of first swell partition
'min_pp1d1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of second swell partition
'min_pp1d2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of third swell partition
'min_pp1d3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction (total)
'min_pwd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of wind waves
'min_pwdw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of total swell
'min_pwds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of first swell partition
'min_pwd1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of second swell partition
'min_pwd2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of third swell partition
'min_pwd3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum whitecap fraction
'min_wcfr' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave Spectral Skewness
'min_wss' = {
discipline = 10 ;
@ -2939,13 +3003,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum 2D wave spectra (single)
'min_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave spectral kurtosis
'min_wsk' = {
discipline = 10 ;
@ -3083,88 +3140,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'std_h1012' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'std_h1214' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'std_h1417' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'std_h1721' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'std_h2125' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'std_h2530' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-standard-deviation significant wave height of all waves with period larger than 10s
'std_sh10' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-standard-deviation significant wave height of first swell partition
'std_swh1' = {
discipline = 10 ;
@ -3256,6 +3231,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of wind waves
'std_pp1dw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of total swell
'std_pp1ds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of first swell partition
'std_pp1d1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of second swell partition
'std_pp1d2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of third swell partition
'std_pp1d3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction (total)
'std_pwd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of wind waves
'std_pwdw' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of total swell
'std_pwds' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of first swell partition
'std_pwd1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of second swell partition
'std_pwd2' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of third swell partition
'std_pwd3' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation whitecap fraction
'std_wcfr' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave Spectral Skewness
'std_wss' = {
discipline = 10 ;
@ -3493,13 +3552,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation 2D wave spectra (single)
'std_2dfd' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave spectral kurtosis
'std_wsk' = {
discipline = 10 ;
@ -16501,6 +16553,12 @@
parameterCategory = 0 ;
parameterNumber = 32 ;
}
#Wet-bulb temperature
'wbt' = {
discipline = 0 ;
parameterCategory = 0 ;
parameterNumber = 27 ;
}
#Sea ice thickness
'sithick' = {
discipline = 10 ;

View File

@ -14,3 +14,5 @@ unsigned[1] numberOfGridInReference : dump;
byte[16] uuidOfHGrid : dump;
template_nofail unstructuredGrid "grib2/localConcepts/[centre:s]/unstructuredGrid.def";
# iterator unstructured(numberOfPoints, missingValue, values, uuidOfHGrid);

View File

@ -1269,6 +1269,78 @@
parameterCategory = 0 ;
parameterNumber = 97 ;
}
#Peak wave period of wind waves
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
}
#Peak wave period of total swell
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
}
#Peak wave period of first swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
}
#Peak wave period of second swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
}
#Peak wave period of third swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
}
#Peak wave direction (total)
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
}
#Peak wave direction of wind waves
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
}
#Peak wave direction of total swell
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
}
#Peak wave direction of first swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
}
#Peak wave direction of second swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
}
#Peak wave direction of third swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
}
#Whitecap fraction
'Fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
}
#Wave Spectral Skewness
'Numeric' = {
discipline = 10 ;
@ -1421,88 +1493,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-mean significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-mean significant wave height of all waves with period larger than 10s
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 0 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-mean significant wave height of first swell partition
'm' = {
discipline = 10 ;
@ -1594,6 +1584,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of wind waves
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of total swell
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of first swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of second swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave period of third swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction (total)
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of wind waves
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of total swell
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of first swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of second swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean peak wave direction of third swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean whitecap fraction
'Fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave Spectral Skewness
'Numeric' = {
discipline = 10 ;
@ -1831,13 +1905,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean 2D wave spectra (single)
'm**2 s radian**-1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 0 ;
}
#Time-mean wave spectral kurtosis
'dimensionless' = {
discipline = 10 ;
@ -1975,88 +2042,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-maximum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-maximum significant wave height of all waves with period larger than 10s
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 2 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-maximum significant wave height of first swell partition
'm' = {
discipline = 10 ;
@ -2148,6 +2133,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of wind waves
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of total swell
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of first swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of second swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave period of third swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction (total)
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of wind waves
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of total swell
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of first swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of second swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum peak wave direction of third swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum whitecap fraction
'Fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave Spectral Skewness
'Numeric' = {
discipline = 10 ;
@ -2385,13 +2454,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum 2D wave spectra (single)
'm**2 s radian**-1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 2 ;
}
#Time-maximum wave spectral kurtosis
'dimensionless' = {
discipline = 10 ;
@ -2529,88 +2591,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-minimum significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-minimum significant wave height of all waves with period larger than 10s
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 3 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-minimum significant wave height of first swell partition
'm' = {
discipline = 10 ;
@ -2702,6 +2682,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of wind waves
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of total swell
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of first swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of second swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave period of third swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction (total)
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of wind waves
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of total swell
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of first swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of second swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum peak wave direction of third swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum whitecap fraction
'Fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave Spectral Skewness
'Numeric' = {
discipline = 10 ;
@ -2939,13 +3003,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum 2D wave spectra (single)
'm**2 s radian**-1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 3 ;
}
#Time-minimum wave spectral kurtosis
'dimensionless' = {
discipline = 10 ;
@ -3083,88 +3140,6 @@
parameterNumber = 79 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 10 to 12 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 12 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 12 to 14 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 12 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 14 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 14 to 17 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 14 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 17 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 17 to 21 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 17 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 21 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 21 to 25 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 21 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 25 ;
}
#Time-standard-deviation significant wave height of all waves with periods within the inclusive range from 25 to 30 seconds
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 7 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 25 ;
scaleFactorOfUpperWavePeriodLimit = 0 ;
scaledValueOfUpperWavePeriodLimit = 30 ;
}
#Time-standard-deviation significant wave height of all waves with period larger than 10s
'm' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 3 ;
typeOfStatisticalProcessing = 6 ;
typeOfWavePeriodInterval = 3 ;
scaleFactorOfLowerWavePeriodLimit = 0 ;
scaledValueOfLowerWavePeriodLimit = 10 ;
}
#Time-standard-deviation significant wave height of first swell partition
'm' = {
discipline = 10 ;
@ -3256,6 +3231,90 @@
parameterNumber = 97 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of wind waves
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 35 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of total swell
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 36 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of first swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 65 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of second swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 66 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave period of third swell partition
's' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 67 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction (total)
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 46 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of wind waves
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 71 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of total swell
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 72 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of first swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 68 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of second swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 69 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation peak wave direction of third swell partition
'Degree true' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 70 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation whitecap fraction
'Fraction' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 73 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave Spectral Skewness
'Numeric' = {
discipline = 10 ;
@ -3493,13 +3552,6 @@
scaleFactorOfFirstFixedSurface = 0 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation 2D wave spectra (single)
'm**2 s radian**-1' = {
discipline = 10 ;
parameterCategory = 0 ;
parameterNumber = 86 ;
typeOfStatisticalProcessing = 6 ;
}
#Time-standard-deviation wave spectral kurtosis
'dimensionless' = {
discipline = 10 ;
@ -16501,6 +16553,12 @@
parameterCategory = 0 ;
parameterNumber = 32 ;
}
#Wet-bulb temperature
'K' = {
discipline = 0 ;
parameterCategory = 0 ;
parameterNumber = 27 ;
}
#Sea ice thickness
'm' = {
discipline = 10 ;

View File

@ -12,6 +12,7 @@
include_directories(
"${CMAKE_CURRENT_SOURCE_DIR}/accessor"
"${CMAKE_CURRENT_SOURCE_DIR}/geo_iterator"
"${CMAKE_CURRENT_SOURCE_DIR}/geo_nearest"
)
list( APPEND eccodes_src_files
@ -325,32 +326,31 @@ list( APPEND eccodes_src_files
grib_expression_class_double.cc
grib_expression_class_string.cc
grib_expression_class_sub_string.cc
grib_nearest.cc
grib_nearest_class.cc
grib_nearest_class_gen.cc
grib_nearest_class_healpix.cc
grib_nearest_class_regular.cc
grib_nearest_class_reduced.cc
grib_nearest_class_latlon_reduced.cc
grib_nearest_class_lambert_conformal.cc
grib_nearest_class_lambert_azimuthal_equal_area.cc
grib_nearest_class_mercator.cc
grib_nearest_class_polar_stereographic.cc
grib_nearest_class_space_view.cc
geo_iterator/grib_iterator_class_polar_stereographic.cc
geo_iterator/grib_iterator_class_lambert_azimuthal_equal_area.cc
geo_iterator/grib_iterator_class_lambert_conformal.cc
geo_iterator/grib_iterator_class_mercator.cc
geo_nearest/grib_nearest.cc
geo_nearest/grib_nearest_class_gen.cc
geo_nearest/grib_nearest_class_healpix.cc
geo_nearest/grib_nearest_class_lambert_azimuthal_equal_area.cc
geo_nearest/grib_nearest_class_lambert_conformal.cc
geo_nearest/grib_nearest_class_latlon_reduced.cc
geo_nearest/grib_nearest_class_mercator.cc
geo_nearest/grib_nearest_class_polar_stereographic.cc
geo_nearest/grib_nearest_class_reduced.cc
geo_nearest/grib_nearest_class_regular.cc
geo_nearest/grib_nearest_class_space_view.cc
geo_iterator/grib_iterator.cc
grib_iterator_class.cc
geo_iterator/grib_iterator_class_gaussian.cc
geo_iterator/grib_iterator_class_gaussian_reduced.cc
geo_iterator/grib_iterator_class_latlon_reduced.cc
geo_iterator/grib_iterator_class_gen.cc
geo_iterator/grib_iterator_class_healpix.cc
geo_iterator/grib_iterator_class_lambert_azimuthal_equal_area.cc
geo_iterator/grib_iterator_class_lambert_conformal.cc
geo_iterator/grib_iterator_class_latlon.cc
geo_iterator/grib_iterator_class_latlon_reduced.cc
geo_iterator/grib_iterator_class_mercator.cc
geo_iterator/grib_iterator_class_polar_stereographic.cc
geo_iterator/grib_iterator_class_regular.cc
geo_iterator/grib_iterator_class_space_view.cc
geo_iterator/grib_iterator_class_healpix.cc
geo_iterator/grib_iterator_class_unstructured.cc
grib_expression.cc
codes_util.cc
grib_util.cc
@ -363,10 +363,8 @@ list( APPEND eccodes_src_files
eccodes_prototypes.h
grib_dumper_class.h
grib_dumper_factory.h
grib_iterator_class.h
grib_iterator_factory.h
grib_nearest_class.h
grib_nearest_factory.h
grib_iterator_factory.cc
grib_nearest_factory.cc
grib_yacc.h
md5.h
md5.cc

View File

@ -66,21 +66,41 @@ int grib_accessor_ascii_t::pack_string(const char* val, size_t* len)
{
grib_handle* hand = grib_handle_of_accessor(this);
const size_t alen = length_;
if (len[0] > (alen + 1)) {
if (*len > (alen + 1)) {
grib_context_log(context_, GRIB_LOG_ERROR,
"pack_string: Wrong size (%zu) for %s, it contains %ld values",
len[0], name_, length_ + 1);
len[0] = 0;
"%s: Buffer too small for %s. It is %zu bytes long (input string len=%zu)",
class_name_, name_, alen, *len);
*len = alen;
return GRIB_BUFFER_TOO_SMALL;
}
for (size_t i = 0; i < alen; i++) {
if (i < len[0])
if (i < *len)
hand->buffer->data[offset_ + i] = val[i];
else
hand->buffer->data[offset_ + i] = 0;
}
// TODO(masn): Make this an error.
// But we have to allow this case unfortunately as returning an error breaks
// clients e.g. grib1 local def 40 has marsDomain of 2 bytes but local def 21
// has the same key with 1 byte! Legacy stuff that cannot be changed easily.
// So at least issue a warning
if (*len > alen) {
// Decode the string and compare with the incoming value
size_t size = 0;
if (grib_get_string_length_acc(this, &size) == GRIB_SUCCESS) {
char* value = (char*)grib_context_malloc_clear(context_, size);
if (value) {
if (this->unpack_string(value, &size) == GRIB_SUCCESS && !STR_EQUAL(val, value)) {
fprintf(stderr, "ECCODES WARNING : String input '%s' truncated to '%s'. Key %s is %zu byte(s)\n",
val, value, name_, alen);
}
grib_context_free(context_, value);
}
}
}
return GRIB_SUCCESS;
}

View File

@ -389,12 +389,21 @@ static int grib_concept_apply(grib_accessor* a, const char* name)
grib_set_values(h, &values[i], 1);
}
}
// else if (STR_EQUAL(values[i].name, "sourceSinkChemicalPhysicalProcess")) {
// if (grib_set_long(h, "is_chemical_srcsink", 1) == GRIB_SUCCESS) {
// resubmit = true;
// grib_set_values(h, &values[i], 1);
// }
// }
else if (STR_EQUAL(values[i].name, "typeOfWavePeriodInterval")) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "%s: Switch to waves selected by period range", __func__);
// TODO(masn): Add a new key e.g. is_wave_period_range
if (grib_set_long(h, "productDefinitionTemplateNumber", 103) == GRIB_SUCCESS) {
resubmit = true;
grib_set_values(h, &values[i], 1);
}
}
else if (STR_EQUAL(values[i].name, "sourceSinkChemicalPhysicalProcess")) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "%s: Switch to chemical src/sink", __func__);
if (grib_set_long(h, "is_chemical_srcsink", 1) == GRIB_SUCCESS) {
resubmit = true;
grib_set_values(h, &values[i], 1);
}
}
}
}

View File

@ -58,7 +58,7 @@ void grib_accessor_expanded_descriptors_t::init(const long len, grib_arguments*
#if MYDEBUG
static int global_depth = -1;
static char* descriptor_type_name(int dtype)
static const char* descriptor_type_name(int dtype)
{
switch (dtype) {
case BUFR_DESCRIPTOR_TYPE_STRING:

View File

@ -13,6 +13,15 @@
grib_accessor_g2_chemical_t _grib_accessor_g2_chemical{};
grib_accessor* grib_accessor_g2_chemical = &_grib_accessor_g2_chemical;
// Meaning of data member chemical_type_:
// 0 = atmospheric chemical constituents
// 1 = atmospheric chemical constituents based on a distribution function
// 2 = atmospheric chemical constituents with source or sink
//
#define CHEM_PLAIN 0
#define CHEM_DISTRIB 1
#define CHEM_SRCSINK 2
void grib_accessor_g2_chemical_t::init(const long l, grib_arguments* c)
{
grib_accessor_unsigned_t::init(l, c);
@ -29,15 +38,10 @@ int grib_accessor_g2_chemical_t::unpack_long(long* val, size_t* len)
long productDefinitionTemplateNumber = 0;
grib_get_long(grib_handle_of_accessor(this), productDefinitionTemplateNumber_, &productDefinitionTemplateNumber);
// Meaning of self->chemical_type:
// 0 = atmospheric chemical constituents
// 1 = atmospheric chemical constituents based on a distribution function
// 2 = atmospheric chemical constituents with source or sink
//
Assert(chemical_type_ == 0 || chemical_type_ == 1 || chemical_type_ == 2);
if (chemical_type_ == 1)
Assert(chemical_type_ == CHEM_PLAIN || chemical_type_ == CHEM_DISTRIB || chemical_type_ == CHEM_SRCSINK);
if (chemical_type_ == CHEM_DISTRIB)
*val = grib2_is_PDTN_ChemicalDistFunc(productDefinitionTemplateNumber);
else if (chemical_type_ == 2)
else if (chemical_type_ == CHEM_SRCSINK)
*val = grib2_is_PDTN_ChemicalSourceSink(productDefinitionTemplateNumber);
else
*val = grib2_is_PDTN_Chemical(productDefinitionTemplateNumber);
@ -74,47 +78,42 @@ int grib_accessor_g2_chemical_t::pack_long(const long* val, size_t* len)
if (!strcmp(stepType, "instant"))
isInstant = 1;
// Meaning of self->chemical_type:
// 0 = atmospheric chemical constituents
// 1 = atmospheric chemical constituents based on a distribution function
// 2 = atmospheric chemical constituents with source or sink
//
Assert(chemical_type_ == 0 || chemical_type_ == 1 || chemical_type_ == 2);
Assert(chemical_type_ == CHEM_PLAIN || chemical_type_ == CHEM_DISTRIB || chemical_type_ == CHEM_SRCSINK);
if (eps == 1) {
if (isInstant) {
if (chemical_type_ == 0)
if (chemical_type_ == CHEM_PLAIN)
productDefinitionTemplateNumberNew = 41;
else if (chemical_type_ == 1)
else if (chemical_type_ == CHEM_DISTRIB)
productDefinitionTemplateNumberNew = 58;
else if (chemical_type_ == 2)
else if (chemical_type_ == CHEM_SRCSINK)
productDefinitionTemplateNumberNew = 77;
}
else {
if (chemical_type_ == 0)
if (chemical_type_ == CHEM_PLAIN)
productDefinitionTemplateNumberNew = 43;
else if (chemical_type_ == 1)
else if (chemical_type_ == CHEM_DISTRIB)
productDefinitionTemplateNumberNew = 68;
else if (chemical_type_ == 2)
else if (chemical_type_ == CHEM_SRCSINK)
productDefinitionTemplateNumberNew = 79;
}
}
else {
// deterministic
if (isInstant) {
if (chemical_type_ == 0)
if (chemical_type_ == CHEM_PLAIN)
productDefinitionTemplateNumberNew = 40;
else if (chemical_type_ == 1)
else if (chemical_type_ == CHEM_DISTRIB)
productDefinitionTemplateNumberNew = 57;
else if (chemical_type_ == 2)
else if (chemical_type_ == CHEM_SRCSINK)
productDefinitionTemplateNumberNew = 76;
}
else {
if (chemical_type_ == 0)
if (chemical_type_ == CHEM_PLAIN)
productDefinitionTemplateNumberNew = 42;
else if (chemical_type_ == 1)
else if (chemical_type_ == CHEM_DISTRIB)
productDefinitionTemplateNumberNew = 67;
else if (chemical_type_ == 2)
else if (chemical_type_ == CHEM_SRCSINK)
productDefinitionTemplateNumberNew = 78;
}
}

View File

@ -11,6 +11,7 @@
#pragma once
#include "grib_accessor_class_gen.h"
#include "geo_iterator/grib_iterator.h"
class grib_accessor_iterator_t : public grib_accessor_gen_t
{

View File

@ -25,34 +25,3 @@ void grib_accessor_nearest_t::dump(grib_dumper* dumper)
grib_dump_label(dumper, this, NULL);
}
#if defined(HAVE_GEOGRAPHY)
grib_nearest* grib_nearest_new(const grib_handle* ch, int* error)
{
grib_handle* h = (grib_handle*)ch;
grib_accessor* a = NULL;
grib_accessor_nearest_t* na = NULL;
grib_nearest* n = NULL;
*error = GRIB_NOT_IMPLEMENTED;
a = grib_find_accessor(h, "NEAREST");
na = (grib_accessor_nearest_t*)a;
if (!a)
return NULL;
n = grib_nearest_factory(h, na->args_, error);
if (n)
*error = GRIB_SUCCESS;
return n;
}
#else
grib_nearest* grib_nearest_new(const grib_handle* ch, int* error)
{
*error = GRIB_FUNCTIONALITY_NOT_ENABLED;
grib_context_log(ch->context, GRIB_LOG_ERROR,
"Nearest neighbour functionality not enabled. Please rebuild with -DENABLE_GEOGRAPHY=ON");
return NULL;
}
#endif

View File

@ -11,6 +11,7 @@
#pragma once
#include "grib_accessor_class_gen.h"
#include "geo_nearest/grib_nearest.h"
class grib_accessor_nearest_t : public grib_accessor_gen_t
{
@ -23,8 +24,5 @@ public:
private:
grib_arguments* args_ = nullptr;
friend grib_nearest* grib_nearest_new(const grib_handle* ch, int* error);
friend eccodes::geo_nearest::Nearest* eccodes::geo_nearest::gribNearestNew(const grib_handle* ch, int* error);
};
// grib_nearest* grib_nearest_new(const grib_handle* ch, int* error);

View File

@ -793,23 +793,23 @@ grib_expression* new_string_expression(grib_context* c, const char* value);
grib_expression* new_sub_string_expression(grib_context* c, const char* value, size_t start, size_t length);
/* grib_nearest.cc */
int grib_nearest_find(grib_nearest* nearest, const grib_handle* h, double inlat, double inlon, unsigned long flags, double* outlats, double* outlons, double* values, double* distances, int* indexes, size_t* len);
int grib_nearest_init(grib_nearest* i, grib_handle* h, grib_arguments* args);
int grib_nearest_delete(grib_nearest* i);
int grib_nearest_get_radius(grib_handle* h, double* radiusInKm);
void grib_binary_search(const double xx[], const size_t n, double x, size_t* ju, size_t* jl);
int grib_nearest_find_multiple(const grib_handle* h, int is_lsm, const double* inlats, const double* inlons, long npoints, double* outlats, double* outlons, double* values, double* distances, int* indexes);
int grib_nearest_find_generic(grib_nearest* nearest, grib_handle* h, double inlat, double inlon, unsigned long flags,
const char* values_keyname,
double** out_lats,
int* out_lats_count,
double** out_lons,
int* out_lons_count,
double** out_distances,
double* outlats, double* outlons, double* values, double* distances, int* indexes, size_t* len);
//int grib_nearest_find(grib_nearest* nearest, const grib_handle* h, double inlat, double inlon, unsigned long flags, double* outlats, double* outlons, double* values, double* distances, int* indexes, size_t* len);
//int grib_nearest_init(grib_nearest* i, grib_handle* h, grib_arguments* args);
//int grib_nearest_delete(grib_nearest* i);
//int grib_nearest_get_radius(grib_handle* h, double* radiusInKm);
//void grib_binary_search(const double xx[], const size_t n, double x, size_t* ju, size_t* jl);
//int grib_nearest_find_multiple(const grib_handle* h, int is_lsm, const double* inlats, const double* inlons, long npoints, double* outlats, double* outlons, double* values, double* distances, int* indexes);
//int grib_nearest_find_generic(grib_nearest* nearest, grib_handle* h, double inlat, double inlon, unsigned long flags,
// const char* values_keyname,
// double** out_lats,
// int* out_lats_count,
// double** out_lons,
// int* out_lons_count,
// double** out_distances,
// double* outlats, double* outlons, double* values, double* distances, int* indexes, size_t* len);
/* grib_nearest_class.cc */
grib_nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* error);
//eccodes::geo_nearest::Nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* error);
/* grib_iterator.cc */
int grib_get_data(const grib_handle* h, double* lats, double* lons, double* values);

View File

@ -11,7 +11,9 @@
/***************************************************************************
* Jean Baptiste Filippi - 01.11.2005 *
***************************************************************************/
#include "grib_iterator.h"
#include "grib_iterator_factory.h"
#include "accessor/grib_accessor_class_iterator.h"
namespace eccodes::geo_iterator {
@ -55,7 +57,6 @@ int gribIteratorDelete(eccodes::geo_iterator::Iterator* i)
return GRIB_SUCCESS;
}
} // namespace eccodes::geo_iterator

View File

@ -0,0 +1,73 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_iterator_class_unstructured.h"
eccodes::geo_iterator::Unstructured _grib_iterator_unstructured{};
eccodes::geo_iterator::Iterator* grib_iterator_unstructured = &_grib_iterator_unstructured;
namespace eccodes::geo_iterator {
#define ITER "Unstructured grid Geoiterator"
int Unstructured::next(double* lat, double* lon, double* val) const
{
if ((long)e_ >= (long)(nv_ - 1))
return 0;
e_++;
*lat = lats_[e_];
*lon = lons_[e_];
if (val && data_) {
*val = data_[e_];
}
return 1;
}
int Unstructured::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args)) != GRIB_SUCCESS)
return ret;
const char* s_uuidOfHGrid = grib_arguments_get_name(h, args, carg_++);
char uuidOfHGrid[32] = {0,};
auto slen = sizeof(uuidOfHGrid);
if ((ret = grib_get_string_internal(h, s_uuidOfHGrid, uuidOfHGrid, &slen)) != GRIB_SUCCESS) {
return ret;
}
lats_ = (double*)grib_context_malloc(h->context, nv_ * sizeof(double));
if (!lats_) {
grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Error allocating %zu bytes", ITER, nv_ * sizeof(double));
return GRIB_OUT_OF_MEMORY;
}
lons_ = (double*)grib_context_malloc(h->context, nv_ * sizeof(double));
if (!lons_) {
grib_context_log(h->context, GRIB_LOG_ERROR, "%s: Error allocating %zu bytes", ITER, nv_ * sizeof(double));
return GRIB_OUT_OF_MEMORY;
}
e_ = -1;
return ret;
}
int Unstructured::destroy()
{
DEBUG_ASSERT(h_);
const grib_context* c = h_->context;
grib_context_free(c, lats_);
grib_context_free(c, lons_);
return Gen::destroy();
}
} // namespace eccodes::geo_iterator

View File

@ -0,0 +1,29 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_iterator_class_gen.h"
namespace eccodes::geo_iterator {
class Unstructured : public Gen
{
public:
Unstructured() :
Gen() { class_name_ = "unstructured"; }
Iterator* create() const override { return new Unstructured(); }
int init(grib_handle*, grib_arguments*) override;
int next(double*, double*, double*) const override;
int destroy() override;
};
} // namespace eccodes::geo_iterator

View File

@ -8,95 +8,250 @@
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
/**
* Author: Enrico Fucile
* date: 31/10/2007
*
*/
#include "grib_nearest.h"
#include "grib_nearest_factory.h"
#include "accessor/grib_accessor_class_nearest.h"
#include "grib_api_internal.h"
/* Note: The 'values' argument can be NULL in which case the data section will not be decoded
* See ECC-499
*/
int grib_nearest_find(
grib_nearest* nearest, const grib_handle* ch,
double inlat, double inlon,
unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
struct PointStore
{
grib_handle* h = (grib_handle*)ch;
grib_nearest_class* c = NULL;
if (!nearest)
return GRIB_INVALID_ARGUMENT;
c = nearest->cclass;
Assert(flags <= (GRIB_NEAREST_SAME_GRID | GRIB_NEAREST_SAME_DATA | GRIB_NEAREST_SAME_POINT));
double m_lat;
double m_lon;
double m_dist;
double m_value;
int m_index;
};
while (c) {
grib_nearest_class* s = c->super ? *(c->super) : NULL;
if (c->find) {
int ret = c->find(nearest, h, inlat, inlon, flags, outlats, outlons, values, distances, indexes, len);
if (ret != GRIB_SUCCESS) {
if (inlon > 0)
inlon -= 360;
else
inlon += 360;
ret = c->find(nearest, h, inlat, inlon, flags, outlats, outlons, values, distances, indexes, len);
}
return ret;
}
c = s;
/* Generic implementation of nearest for Lambert, Polar stereo, Mercator etc */
static int compare_doubles(const void* a, const void* b, int ascending)
{
/* ascending is a boolean: 0 or 1 */
const double* arg1 = (const double*)a;
const double* arg2 = (const double*)b;
if (ascending) {
if (*arg1 < *arg2)
return -1; /*Smaller values come before larger ones*/
}
Assert(0);
else {
if (*arg1 > *arg2)
return -1; /*Larger values come before smaller ones*/
}
if (*arg1 == *arg2)
return 0;
else
return 1;
}
static int compare_doubles_ascending(const void* a, const void* b)
{
return compare_doubles(a, b, 1);
}
/* Comparison function to sort points by distance */
static int compare_points(const void* a, const void* b)
{
const PointStore* pA = (const PointStore*)a;
const PointStore* pB = (const PointStore*)b;
if (pA->m_dist < pB->m_dist) return -1;
if (pA->m_dist > pB->m_dist) return 1;
return 0;
}
/* For this one, ALL init are called */
static int init_nearest(grib_nearest_class* c, grib_nearest* i, grib_handle* h, grib_arguments* args)
namespace eccodes::geo_nearest {
int Nearest::init(grib_handle* h, grib_arguments* args)
{
if (c) {
int ret = GRIB_SUCCESS;
grib_nearest_class* s = c->super ? *(c->super) : NULL;
if (!c->inited) {
if (c->init_class)
c->init_class(c);
c->inited = 1;
}
if (s)
ret = init_nearest(s, i, h, args);
if (ret != GRIB_SUCCESS)
return ret;
if (c->init)
return c->init(i, h, args);
}
return GRIB_INTERNAL_ERROR;
}
int grib_nearest_init(grib_nearest* i, grib_handle* h, grib_arguments* args)
{
return init_nearest(i->cclass, i, h, args);
//h_ = h;
return GRIB_SUCCESS;
}
/* For this one, ALL destroy are called */
int grib_nearest_delete(grib_nearest* i)
int Nearest::destroy()
{
grib_nearest_class* c = NULL;
if (!i)
return GRIB_INVALID_ARGUMENT;
c = i->cclass;
while (c) {
grib_nearest_class* s = c->super ? *(c->super) : NULL;
if (c->destroy)
c->destroy(i);
c = s;
}
return 0;
delete this;
return GRIB_SUCCESS;
}
int Nearest::grib_nearest_find_generic(
grib_handle* h,
double inlat, double inlon, unsigned long flags,
const char* values_keyname,
double** out_lats,
int* out_lats_count,
double** out_lons,
int* out_lons_count,
double** out_distances,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
int ret = 0;
size_t i = 0, nvalues = 0, nneighbours = 0;
double radiusInKm;
grib_iterator* iter = NULL;
double lat = 0, lon = 0;
/* array of candidates for nearest neighbours */
PointStore* neighbours = NULL;
inlon = normalise_longitude_in_degrees(inlon);
if ((ret = grib_get_size(h, values_keyname, &nvalues)) != GRIB_SUCCESS)
return ret;
values_count_ = nvalues;
if ((ret = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return ret;
neighbours = (PointStore*)grib_context_malloc(h->context, nvalues * sizeof(PointStore));
for (i = 0; i < nvalues; ++i) {
neighbours[i].m_dist = 1e10; /* set all distances to large number to begin with */
neighbours[i].m_lat = 0;
neighbours[i].m_lon = 0;
neighbours[i].m_value = 0;
neighbours[i].m_index = 0;
}
/* GRIB_NEAREST_SAME_GRID not yet implemented */
{
double the_value = 0;
double min_dist = 1e10;
size_t the_index = 0;
int ilat = 0, ilon = 0;
size_t idx_upper = 0, idx_lower = 0;
double lat1 = 0, lat2 = 0; /* inlat will be between these */
const double LAT_DELTA = 10.0; /* in degrees */
*out_lons_count = (int)nvalues; /* Maybe overestimate but safe */
*out_lats_count = (int)nvalues;
if (*out_lats)
grib_context_free(h->context, *out_lats);
*out_lats = (double*)grib_context_malloc(h->context, nvalues * sizeof(double));
if (!*out_lats)
return GRIB_OUT_OF_MEMORY;
if (*out_lons)
grib_context_free(h->context, *out_lons);
*out_lons = (double*)grib_context_malloc(h->context, nvalues * sizeof(double));
if (!*out_lons)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, 0, &ret);
if (ret) {
free(neighbours);
return ret;
}
/* First pass: collect all latitudes and longitudes */
while (grib_iterator_next(iter, &lat, &lon, &the_value)) {
++the_index;
Assert(ilat < *out_lats_count);
Assert(ilon < *out_lons_count);
(*out_lats)[ilat++] = lat;
(*out_lons)[ilon++] = lon;
}
/* See between which 2 latitudes our point lies */
qsort(*out_lats, nvalues, sizeof(double), &compare_doubles_ascending);
grib_binary_search(*out_lats, *out_lats_count - 1, inlat, &idx_upper, &idx_lower);
lat2 = (*out_lats)[idx_upper];
lat1 = (*out_lats)[idx_lower];
Assert(lat1 <= lat2);
/* Second pass: Iterate again and collect candidate neighbours */
grib_iterator_reset(iter);
the_index = 0;
i = 0;
while (grib_iterator_next(iter, &lat, &lon, &the_value)) {
if (lat > lat2 + LAT_DELTA || lat < lat1 - LAT_DELTA) {
/* Ignore latitudes too far from our point */
}
else {
double dist = geographic_distance_spherical(radiusInKm, inlon, inlat, lon, lat);
if (dist < min_dist)
min_dist = dist;
/*printf("Candidate: lat=%.5f lon=%.5f dist=%f Idx=%ld Val=%f\n",lat,lon,dist,the_index,the_value);*/
/* store this candidate point */
neighbours[i].m_dist = dist;
neighbours[i].m_index = (int)the_index;
neighbours[i].m_lat = lat;
neighbours[i].m_lon = lon;
neighbours[i].m_value = the_value;
i++;
}
++the_index;
}
nneighbours = i;
/* Sort the candidate neighbours in ascending order of distance */
/* The first 4 entries will now be the closest 4 neighbours */
qsort(neighbours, nneighbours, sizeof(PointStore), &compare_points);
grib_iterator_delete(iter);
}
h_ = h;
/* Sanity check for sorting */
#ifdef DEBUG
for (i = 0; i < nneighbours - 1; ++i) {
Assert(neighbours[i].m_dist <= neighbours[i + 1].m_dist);
}
#endif
/* GRIB_NEAREST_SAME_XXX not yet implemented */
if (!*out_distances) {
*out_distances = (double*)grib_context_malloc(h->context, 4 * sizeof(double));
}
(*out_distances)[0] = neighbours[0].m_dist;
(*out_distances)[1] = neighbours[1].m_dist;
(*out_distances)[2] = neighbours[2].m_dist;
(*out_distances)[3] = neighbours[3].m_dist;
for (i = 0; i < 4; ++i) {
distances[i] = neighbours[i].m_dist;
outlats[i] = neighbours[i].m_lat;
outlons[i] = neighbours[i].m_lon;
indexes[i] = neighbours[i].m_index;
if (values) {
values[i] = neighbours[i].m_value;
}
/*printf("(%f,%f) i=%d d=%f v=%f\n",outlats[i],outlons[i],indexes[i],distances[i],values[i]);*/
}
free(neighbours);
return GRIB_SUCCESS;
}
eccodes::geo_nearest::Nearest* gribNearestNew(const grib_handle* ch, int* error)
{
*error = GRIB_NOT_IMPLEMENTED;
grib_handle* h = (grib_handle*)ch;
grib_accessor* a = grib_find_accessor(h, "NEAREST");
grib_accessor_nearest_t* n = (grib_accessor_nearest_t*)a;
if (!a)
return NULL;
eccodes::geo_nearest::Nearest* nearest = grib_nearest_factory(h, n->args_, error);
if (nearest)
*error = GRIB_SUCCESS;
return nearest;
}
int gribNearestDelete(eccodes::geo_nearest::Nearest* i)
{
if (i)
i->destroy();
return GRIB_SUCCESS;
}
} // namespace eccodes::geo_nearest
/* Get the radius in kilometres for nearest neighbour distance calculations */
/* For an ellipsoid, approximate the radius using the average of the semimajor and semiminor axes */
int grib_nearest_get_radius(grib_handle* h, double* radiusInKm)
@ -105,8 +260,6 @@ int grib_nearest_get_radius(grib_handle* h, double* radiusInKm)
long lRadiusInMetres;
double result = 0;
const char* s_radius = "radius";
const char* s_minor = "earthMinorAxisInMetres";
const char* s_major = "earthMajorAxisInMetres";
if ((err = grib_get_long(h, s_radius, &lRadiusInMetres)) == GRIB_SUCCESS) {
if (grib_is_missing(h, s_radius, &err) || lRadiusInMetres == GRIB_MISSING_LONG) {
@ -117,6 +270,8 @@ int grib_nearest_get_radius(grib_handle* h, double* radiusInKm)
}
else {
double minor = 0, major = 0;
const char* s_minor = "earthMinorAxisInMetres";
const char* s_major = "earthMajorAxisInMetres";
if ((err = grib_get_double_internal(h, s_minor, &minor)) != GRIB_SUCCESS) return err;
if ((err = grib_get_double_internal(h, s_major, &major)) != GRIB_SUCCESS) return err;
if (grib_is_missing(h, s_minor, &err)) return GRIB_GEOCALCULUS_PROBLEM;
@ -145,6 +300,13 @@ void grib_binary_search(const double xx[], const size_t n, double x, size_t* ju,
}
}
/*
* C API Implementation
* codes_iterator_* wrappers are in eccodes.h and eccodes.cc
* grib_iterator_* declarations are in grib_api.h
*/
int grib_nearest_find_multiple(
const grib_handle* h, int is_lsm,
const double* inlats, const double* inlons, long npoints,
@ -244,198 +406,65 @@ int grib_nearest_find_multiple(
return ret;
}
/* Generic implementation of nearest for Lambert, Polar stereo, Mercator etc */
static int compare_doubles(const void* a, const void* b, int ascending)
{
/* ascending is a boolean: 0 or 1 */
double* arg1 = (double*)a;
double* arg2 = (double*)b;
if (ascending) {
if (*arg1 < *arg2)
return -1; /*Smaller values come before larger ones*/
}
else {
if (*arg1 > *arg2)
return -1; /*Larger values come before smaller ones*/
}
if (*arg1 == *arg2)
return 0;
else
return 1;
}
static int compare_doubles_ascending(const void* a, const void* b)
{
return compare_doubles(a, b, 1);
}
typedef struct PointStore
{
double m_lat;
double m_lon;
double m_dist;
double m_value;
int m_index;
} PointStore;
/* Comparison function to sort points by distance */
static int compare_points(const void* a, const void* b)
{
PointStore* pA = (PointStore*)a;
PointStore* pB = (PointStore*)b;
if (pA->m_dist < pB->m_dist) return -1;
if (pA->m_dist > pB->m_dist) return 1;
return 0;
}
int grib_nearest_find_generic(
grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
const char* values_keyname,
double** out_lats,
int* out_lats_count,
double** out_lons,
int* out_lons_count,
double** out_distances,
/* Note: The 'values' argument can be NULL in which case the data section will not be decoded
* See ECC-499
*/
int grib_nearest_find(
grib_nearest* nearest, const grib_handle* ch,
double inlat, double inlon,
unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
int ret = 0;
size_t i = 0, nvalues = 0, nneighbours = 0;
double radiusInKm;
grib_iterator* iter = NULL;
double lat = 0, lon = 0;
grib_handle* h = (grib_handle*)ch;
if (!nearest)
return GRIB_INVALID_ARGUMENT;
Assert(flags <= (GRIB_NEAREST_SAME_GRID | GRIB_NEAREST_SAME_DATA | GRIB_NEAREST_SAME_POINT));
/* array of candidates for nearest neighbours */
PointStore* neighbours = NULL;
inlon = normalise_longitude_in_degrees(inlon);
if ((ret = grib_get_size(h, values_keyname, &nvalues)) != GRIB_SUCCESS)
return ret;
nearest->values_count = nvalues;
if ((ret = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return ret;
neighbours = (PointStore*)grib_context_malloc(h->context, nvalues * sizeof(PointStore));
for (i = 0; i < nvalues; ++i) {
neighbours[i].m_dist = 1e10; /* set all distances to large number to begin with */
neighbours[i].m_lat = 0;
neighbours[i].m_lon = 0;
neighbours[i].m_value = 0;
neighbours[i].m_index = 0;
int ret = nearest->nearest->find(h, inlat, inlon, flags, outlats, outlons, values, distances, indexes, len);
if (ret != GRIB_SUCCESS) {
if (inlon > 0)
inlon -= 360;
else
inlon += 360;
ret = nearest->nearest->find(h, inlat, inlon, flags, outlats, outlons, values, distances, indexes, len);
}
return ret;
}
/* GRIB_NEAREST_SAME_GRID not yet implemented */
{
double the_value = 0;
double min_dist = 1e10;
size_t the_index = 0;
int ilat = 0, ilon = 0;
size_t idx_upper = 0, idx_lower = 0;
double lat1 = 0, lat2 = 0; /* inlat will be between these */
const double LAT_DELTA = 10.0; /* in degrees */
int grib_nearest_init(grib_nearest* i, grib_handle* h, grib_arguments* args)
{
return i->nearest->init(h, args);
}
*out_lons_count = (int)nvalues; /* Maybe overestimate but safe */
*out_lats_count = (int)nvalues;
if (*out_lats)
grib_context_free(h->context, *out_lats);
*out_lats = (double*)grib_context_malloc(h->context, nvalues * sizeof(double));
if (!*out_lats)
return GRIB_OUT_OF_MEMORY;
if (*out_lons)
grib_context_free(h->context, *out_lons);
*out_lons = (double*)grib_context_malloc(h->context, nvalues * sizeof(double));
if (!*out_lons)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, 0, &ret);
if (ret) {
free(neighbours);
return ret;
}
/* First pass: collect all latitudes and longitudes */
while (grib_iterator_next(iter, &lat, &lon, &the_value)) {
++the_index;
Assert(ilat < *out_lats_count);
Assert(ilon < *out_lons_count);
(*out_lats)[ilat++] = lat;
(*out_lons)[ilon++] = lon;
}
/* See between which 2 latitudes our point lies */
qsort(*out_lats, nvalues, sizeof(double), &compare_doubles_ascending);
grib_binary_search(*out_lats, *out_lats_count - 1, inlat, &idx_upper, &idx_lower);
lat2 = (*out_lats)[idx_upper];
lat1 = (*out_lats)[idx_lower];
Assert(lat1 <= lat2);
/* Second pass: Iterate again and collect candidate neighbours */
grib_iterator_reset(iter);
the_index = 0;
i = 0;
while (grib_iterator_next(iter, &lat, &lon, &the_value)) {
if (lat > lat2 + LAT_DELTA || lat < lat1 - LAT_DELTA) {
/* Ignore latitudes too far from our point */
}
else {
double dist = geographic_distance_spherical(radiusInKm, inlon, inlat, lon, lat);
if (dist < min_dist)
min_dist = dist;
/*printf("Candidate: lat=%.5f lon=%.5f dist=%f Idx=%ld Val=%f\n",lat,lon,dist,the_index,the_value);*/
/* store this candidate point */
neighbours[i].m_dist = dist;
neighbours[i].m_index = (int)the_index;
neighbours[i].m_lat = lat;
neighbours[i].m_lon = lon;
neighbours[i].m_value = the_value;
i++;
}
++the_index;
}
nneighbours = i;
/* Sort the candidate neighbours in ascending order of distance */
/* The first 4 entries will now be the closest 4 neighbours */
qsort(neighbours, nneighbours, sizeof(PointStore), &compare_points);
grib_iterator_delete(iter);
int grib_nearest_delete(grib_nearest* i)
{
if (i) {
grib_context* c = grib_context_get_default();
gribNearestDelete(i->nearest);
grib_context_free(c, i);
}
nearest->h = h;
/* Sanity check for sorting */
#ifdef DEBUG
for (i = 0; i < nneighbours - 1; ++i) {
Assert(neighbours[i].m_dist <= neighbours[i + 1].m_dist);
}
#endif
/* GRIB_NEAREST_SAME_XXX not yet implemented */
if (!*out_distances) {
*out_distances = (double*)grib_context_malloc(h->context, 4 * sizeof(double));
}
(*out_distances)[0] = neighbours[0].m_dist;
(*out_distances)[1] = neighbours[1].m_dist;
(*out_distances)[2] = neighbours[2].m_dist;
(*out_distances)[3] = neighbours[3].m_dist;
for (i = 0; i < 4; ++i) {
distances[i] = neighbours[i].m_dist;
outlats[i] = neighbours[i].m_lat;
outlons[i] = neighbours[i].m_lon;
indexes[i] = neighbours[i].m_index;
if (values) {
values[i] = neighbours[i].m_value;
}
/*printf("(%f,%f) i=%d d=%f v=%f\n",outlats[i],outlons[i],indexes[i],distances[i],values[i]);*/
}
free(neighbours);
return GRIB_SUCCESS;
}
#if defined(HAVE_GEOGRAPHY)
grib_nearest* grib_nearest_new(const grib_handle* ch, int* error)
{
grib_nearest* i = (grib_nearest*)grib_context_malloc_clear(ch->context, sizeof(grib_nearest));
i->nearest = eccodes::geo_nearest::gribNearestNew(ch, error);
if (!i->nearest) {
grib_context_free(ch->context, i);
return NULL;
}
return i;
}
#else
grib_nearest* grib_nearest_new(const grib_handle* ch, int* error)
{
*error = GRIB_FUNCTIONALITY_NOT_ENABLED;
grib_context_log(ch->context, GRIB_LOG_ERROR,
"Nearest neighbour functionality not enabled. Please rebuild with -DENABLE_GEOGRAPHY=ON");
return NULL;
}
#endif

View File

@ -0,0 +1,48 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_api_internal.h"
namespace eccodes::geo_nearest {
class Nearest {
public:
virtual ~Nearest() {}
virtual int init(grib_handle*, grib_arguments*) = 0;
virtual int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) = 0;
virtual int destroy() = 0;
virtual Nearest* create() = 0;
protected:
int grib_nearest_find_generic(grib_handle*, double, double, unsigned long,
const char*,
double**,
int*,
double**,
int*,
double**,
double*, double*, double*, double*, int*, size_t*);
grib_handle* h_ = nullptr;
double* values_ = nullptr;
size_t values_count_ = 0;
unsigned long flags_ = 0;
const char* class_name_ = nullptr;
};
Nearest* gribNearestNew(const grib_handle*, int*);
int gribNearestDelete(Nearest*);
} // namespace eccodes::geo_nearest
int grib_nearest_get_radius(grib_handle* h, double* radiusInKm);
void grib_binary_search(const double xx[], const size_t n, double x, size_t* ju, size_t* jl);

View File

@ -0,0 +1,53 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
int Gen::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Nearest::init(h, args) != GRIB_SUCCESS))
return ret;
cargs_ = 1;
values_key_ = grib_arguments_get_name(h, args, cargs_++);
radius_ = grib_arguments_get_name(h, args, cargs_++);
values_ = NULL;
return ret;
}
int Gen::destroy()
{
grib_context* c = grib_context_get_default();
if (lats_) grib_context_free(c, lats_);
if (lons_) grib_context_free(c, lons_);
if (i_) grib_context_free(c, i_);
if (j_) grib_context_free(c, j_);
if (k_) grib_context_free(c, k_);
if (distances_) grib_context_free(c, distances_);
if (values_) grib_context_free(c, values_);
return Nearest::destroy();
}
int Gen::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
return GRIB_NOT_IMPLEMENTED;
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,58 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest.h"
namespace eccodes::geo_nearest {
class Gen : public Nearest {
public:
Gen() { class_name_ = "gen"; }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
int destroy() override;
protected:
int cargs_ = 0;
const char* values_key_ = nullptr;
double* lats_ = nullptr;
int lats_count_ = 0;
double* lons_ = nullptr;
int lons_count_ = 0;
double* distances_ = nullptr;
size_t* k_ = nullptr;
size_t* i_ = nullptr;
size_t* j_ = nullptr;
const char* Ni_ = nullptr;
const char* Nj_ = nullptr;
private:
const char* radius_ = nullptr;
};
int grib_nearest_find_generic(
Nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
const char* values_keyname,
double** out_lats,
int* out_lats_count,
double** out_lons,
int* out_lons_count,
double** out_distances,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len);
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,51 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_healpix.h"
eccodes::geo_nearest::Healpix _grib_nearest_healpix{};
eccodes::geo_nearest::Nearest* grib_nearest_healpix = &_grib_nearest_healpix;
namespace eccodes::geo_nearest {
int Healpix::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
int Healpix::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
return grib_nearest_find_generic(
h, inlat, inlon, flags, /* inputs */
values_key_, /* outputs to set the 'self' object */
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count_),
&(distances_),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class Healpix : public Gen {
public:
Healpix() {
class_name_ = "healpix";
}
Nearest* create() override { return new Healpix(); };
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,51 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_lambert_azimuthal_equal_area.h"
eccodes::geo_nearest::LambertAzimuthalEqualArea _grib_nearest_lambert_azimuthal_equal_area{};
eccodes::geo_nearest::Nearest* grib_nearest_lambert_azimuthal_equal_area = &_grib_nearest_lambert_azimuthal_equal_area;
namespace eccodes::geo_nearest {
int LambertAzimuthalEqualArea::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
int LambertAzimuthalEqualArea::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
return grib_nearest_find_generic(
h, inlat, inlon, flags, /* inputs */
values_key_, /* outputs to set the 'self' object */
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count_),
&(distances_),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class LambertAzimuthalEqualArea : public Gen {
public:
LambertAzimuthalEqualArea() {
class_name_ = "lambert_azimuthal_equal_area";
}
Nearest* create() override { return new LambertAzimuthalEqualArea(); }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,51 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_lambert_conformal.h"
eccodes::geo_nearest::LambertConformal _grib_nearest_lambert_conformal{};
eccodes::geo_nearest::Nearest* grib_nearest_lambert_conformal = &_grib_nearest_lambert_conformal;
namespace eccodes::geo_nearest {
int LambertConformal::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
int LambertConformal::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
return grib_nearest_find_generic(
h, inlat, inlon, flags, /* inputs */
values_key_, /* outputs to set the 'self' object */
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count_),
&(distances_),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class LambertConformal : public Gen {
public:
LambertConformal() {
class_name_ = "lambert_conformal";
}
Nearest* create() override { return new LambertConformal(); };
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,344 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_latlon_reduced.h"
eccodes::geo_nearest::LatlonReduced _grib_nearest_latlon_reduced{};
eccodes::geo_nearest::Nearest* grib_nearest_latlon_reduced = &_grib_nearest_latlon_reduced;
namespace eccodes::geo_nearest {
int LatlonReduced::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Nj_ = grib_arguments_get_name(h, args, cargs_++);
pl_ = grib_arguments_get_name(h, args, cargs_++);
lonFirst_ = grib_arguments_get_name(h, args, cargs_++);
lonLast_ = grib_arguments_get_name(h, args, cargs_++);
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
if (!j_)
return GRIB_OUT_OF_MEMORY;
k_ = (size_t*)grib_context_malloc(h->context, 4 * sizeof(size_t));
if (!k_)
return GRIB_OUT_OF_MEMORY;
return ret;
}
int LatlonReduced::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
int err = 0;
double lat1, lat2, lon1, lon2;
int is_global = 1;
if (grib_get_double(h, "longitudeFirstInDegrees", &lon1) == GRIB_SUCCESS &&
grib_get_double(h, "longitudeLastInDegrees", &lon2) == GRIB_SUCCESS &&
grib_get_double(h, "latitudeFirstInDegrees", &lat1) == GRIB_SUCCESS &&
grib_get_double(h, "latitudeLastInDegrees", &lat2) == GRIB_SUCCESS)
{
const double difflat = fabs(lat1-lat2);
if (difflat < 180 || lon1 != 0 || lon2 < 359) {
is_global = 0; /* subarea */
}
}
if (is_global) {
err = find_global(h, inlat, inlon, flags,
outlats, outlons, values,
distances, indexes, len);
}
else
{
int lons_count = 0; /*dummy*/
err = grib_nearest_find_generic(
h, inlat, inlon, flags,
values_key_,
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count),
&(distances_),
outlats, outlons,
values, distances, indexes, len);
}
return err;
}
int LatlonReduced::find_global(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
int ret = 0, kk = 0, ii = 0, jj = 0;
int j = 0;
long* pla = NULL;
long* pl = NULL;
size_t nvalues = 0;
grib_iterator* iter = NULL;
double lat = 0, lon = 0;
double radiusInKm;
int ilat = 0, ilon = 0;
if ((ret = grib_get_size(h, values_key_, &nvalues)) != GRIB_SUCCESS)
return ret;
values_count_ = nvalues;
if ((ret = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return ret;
/* Compute lat/lon info, create iterator etc if it's the 1st time or different grid.
* This is for performance: if the grid has not changed, we only do this once
* and reuse for other messages */
if (!h_ || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double olat = 1.e10;
long n = 0;
ilat = 0;
ilon = 0;
if (grib_is_missing(h, Nj_, &ret)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", Nj_);
return ret ? ret : GRIB_GEOCALCULUS_PROBLEM;
}
if ((ret = grib_get_long(h, Nj_, &n)) != GRIB_SUCCESS)
return ret;
lats_count_ = n;
if (lats_)
grib_context_free(h->context, lats_);
lats_ = (double*)grib_context_malloc(h->context,
lats_count_ * sizeof(double));
if (!lats_)
return GRIB_OUT_OF_MEMORY;
if (lons_)
grib_context_free(h->context, lons_);
lons_ = (double*)grib_context_malloc(h->context,
values_count_ * sizeof(double));
if (!lons_)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, GRIB_GEOITERATOR_NO_VALUES, &ret);
if (ret) {
grib_context_log(h->context, GRIB_LOG_ERROR, "Unable to create iterator");
return ret;
}
while (grib_iterator_next(iter, &lat, &lon, NULL)) {
if (ilat < lats_count_ && olat != lat) {
lats_[ilat++] = lat;
olat = lat;
}
lons_[ilon++] = lon;
}
lats_count_ = ilat;
grib_iterator_delete(iter);
}
h_ = h;
/* Compute distances if it's the 1st time or different point or different grid.
* This is for performance: if the grid and the input point have not changed
* we only do this once and reuse for other messages */
if (!distances_ || (flags & GRIB_NEAREST_SAME_POINT) == 0 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double* lons = NULL;
int nlon = 0;
size_t plsize = 0;
long nplm1 = 0;
int nearest_lons_found = 0;
double lon_first, lon_last;
int islocal = 0;
long plmax;
double dimin;
if ((ret = grib_get_double(h, lonFirst_, &lon_first)) != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR,
"grib_nearest_latlon_reduced.find(): unable to get %s %s\n", lonFirst_,
grib_get_error_message(ret));
return ret;
}
if ((ret = grib_get_double(h, lonLast_, &lon_last)) != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR,
"grib_nearest_latlon_reduced.find(): unable to get %s %s\n", lonLast_,
grib_get_error_message(ret));
return ret;
}
plsize = lats_count_;
if ((ret = grib_get_size(h, pl_, &plsize)) != GRIB_SUCCESS)
return ret;
pla = (long*)grib_context_malloc(h->context, plsize * sizeof(long));
if (!pla)
return GRIB_OUT_OF_MEMORY;
if ((ret = grib_get_long_array(h, pl_, pla, &plsize)) != GRIB_SUCCESS)
return ret;
pl = pla;
while ((*pl) == 0) {
pl++;
}
plmax = pla[0];
for (j = 0; j < plsize; j++)
if (plmax < pla[j])
plmax = pla[j];
dimin = 360.0 / plmax;
if (360 - fabs(lon_last - lon_first) < 2 * dimin) {
islocal = 0;
}
else {
islocal = 1;
}
if (islocal)
for (j = 0; j < plsize; j++)
pla[j]--;
/* printf("XXXX islocal=%d\n",islocal); */
while (inlon < 0)
inlon += 360;
while (inlon > 360)
inlon -= 360;
ilat = lats_count_;
if (lats_[ilat - 1] > lats_[0]) {
if (inlat < lats_[0] || inlat > lats_[ilat - 1])
return GRIB_OUT_OF_AREA;
}
else {
if (inlat > lats_[0] || inlat < lats_[ilat - 1])
return GRIB_OUT_OF_AREA;
}
if (!distances_)
distances_ = (double*)grib_context_malloc(h->context, 4 * sizeof(double));
if (!distances_)
return GRIB_OUT_OF_MEMORY;
//void grib_binary_search(const double xx[], const size_t n, double x, size_t* ju, size_t* jl)
grib_binary_search(lats_, ilat - 1, inlat,
&(j_[0]), &(j_[1]));
nlon = 0;
for (jj = 0; jj < j_[0]; jj++)
nlon += pl[jj];
nplm1 = pl[j_[0]] - 1;
lons = lons_ + nlon;
nearest_lons_found = 0;
if (lons[nplm1] > lons[0]) {
if (inlon < lons[0] || inlon > lons[nplm1]) {
if (lons[nplm1] - lons[0] - 360 <=
lons[nplm1] - lons[nplm1 - 1]) {
k_[0] = 0;
k_[1] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
else {
if (inlon > lons[0] || inlon < lons[nplm1]) {
if (lons[0] - lons[nplm1] - 360 <=
lons[0] - lons[1]) {
k_[0] = 0;
k_[1] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
if (!nearest_lons_found) {
grib_binary_search(lons, pl[j_[0]] - 1, inlon,
&(k_[0]), &(k_[1]));
}
k_[0] += nlon;
k_[1] += nlon;
nlon = 0;
for (jj = 0; jj < j_[1]; jj++)
nlon += pl[jj];
nplm1 = pl[j_[1]] - 1;
lons = lons_ + nlon;
nearest_lons_found = 0;
if (lons[nplm1] > lons[0]) {
if (inlon < lons[0] || inlon > lons[nplm1]) {
if (lons[nplm1] - lons[0] - 360 <=
lons[nplm1] - lons[nplm1 - 1]) {
k_[2] = 0;
k_[3] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
else {
if (inlon > lons[0] || inlon < lons[nplm1]) {
if (lons[0] - lons[nplm1] - 360 <=
lons[0] - lons[1]) {
k_[2] = 0;
k_[3] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
if (!nearest_lons_found) {
grib_binary_search(lons, pl[j_[1]] - 1, inlon,
&(k_[2]), &(k_[3]));
}
k_[2] += nlon;
k_[3] += nlon;
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
distances_[kk] = geographic_distance_spherical(radiusInKm, inlon, inlat,
lons_[k_[kk]], lats_[j_[jj]]);
kk++;
}
}
grib_context_free(h->context, pla);
}
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
distances[kk] = distances_[kk];
outlats[kk] = lats_[j_[jj]];
outlons[kk] = lons_[k_[kk]];
if (values) { /* ECC-499 */
grib_get_double_element_internal(h, values_key_, k_[kk], &(values[kk]));
}
indexes[kk] = (int)k_[kk];
kk++;
}
}
return GRIB_SUCCESS;
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,37 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class LatlonReduced : public Gen {
public:
LatlonReduced() {
class_name_ = "latlon_reduced";
}
Nearest* create() override { return new LatlonReduced(); }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
private:
const char* pl_ = nullptr;
const char* lonFirst_ = nullptr;
const char* lonLast_ = nullptr;
int find_global(grib_handle*,
double, double, unsigned long,
double*, double*, double*,
double*, int*, size_t*);
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,51 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_mercator.h"
eccodes::geo_nearest::Mercator _grib_nearest_mercator{};
eccodes::geo_nearest::Nearest* grib_nearest_mercator = &_grib_nearest_mercator;
namespace eccodes::geo_nearest {
int Mercator::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
int Mercator::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
return grib_nearest_find_generic(
h, inlat, inlon, flags, /* inputs */
values_key_, /* outputs to set the 'self' object */
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count_),
&(distances_),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class Mercator : public Gen {
public:
Mercator() {
class_name_ = "mercator";
}
Nearest* create() override { return new Mercator(); };
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,51 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_polar_stereographic.h"
eccodes::geo_nearest::PolarStereographic _grib_nearest_polar_stereographic{};
eccodes::geo_nearest::Nearest* grib_nearest_polar_stereographic = &_grib_nearest_polar_stereographic;
namespace eccodes::geo_nearest {
int PolarStereographic::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
int PolarStereographic::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
return grib_nearest_find_generic(
h, inlat, inlon, flags, /* inputs */
values_key_, /* outputs to set the 'self' object */
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count_),
&(distances_),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class PolarStereographic : public Gen {
public:
PolarStereographic() {
class_name_ = "polar_stereographic";
}
Nearest* create() override { return new PolarStereographic(); }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -8,119 +8,43 @@
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
#include "grib_nearest_class_reduced.h"
/*
This is used by make_class.pl
eccodes::geo_nearest::Reduced _grib_nearest_reduced{};
eccodes::geo_nearest::Nearest* grib_nearest_reduced = &_grib_nearest_reduced;
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init;destroy;find
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = double* distances
MEMBERS = size_t* k
MEMBERS = size_t* j
MEMBERS = const char* Nj
MEMBERS = const char* pl
MEMBERS = long global
MEMBERS = double lon_first
MEMBERS = double lon_last
MEMBERS = int legacy
MEMBERS = int rotated
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_reduced{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in reduced */
double* lats;
int lats_count;
double* lons;
double* distances;
size_t* k;
size_t* j;
const char* Nj;
const char* pl;
long global;
double lon_first;
double lon_last;
int legacy;
int rotated;
} grib_nearest_reduced;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_reduced = {
&grib_nearest_class_gen, /* super */
"reduced", /* name */
sizeof(grib_nearest_reduced), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_reduced = &_grib_nearest_class_reduced;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
namespace eccodes::geo_nearest {
#define NUM_NEIGHBOURS 4
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
int Reduced::init(grib_handle* h, grib_arguments* args)
{
grib_nearest_reduced* self = (grib_nearest_reduced*)nearest;
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->pl = grib_arguments_get_name(h, args, self->cargs++);
self->j = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
self->legacy = -1;
self->rotated = -1;
if (!self->j)
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Nj_ = grib_arguments_get_name(h, args, cargs_++);
pl_ = grib_arguments_get_name(h, args, cargs_++);
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
legacy_ = -1;
rotated_ = -1;
if (!j_)
return GRIB_OUT_OF_MEMORY;
self->k = (size_t*)grib_context_malloc(h->context, NUM_NEIGHBOURS * sizeof(size_t));
if (!self->k)
k_ = (size_t*)grib_context_malloc(h->context, NUM_NEIGHBOURS * sizeof(size_t));
if (!k_)
return GRIB_OUT_OF_MEMORY;
grib_get_long(h, "global", &self->global);
if (!self->global) {
grib_get_long(h, "global", &global_);
if (!global_) {
int err;
/*TODO longitudeOfFirstGridPointInDegrees from the def file*/
if ((err = grib_get_double(h, "longitudeOfFirstGridPointInDegrees", &self->lon_first)) != GRIB_SUCCESS) {
if ((err = grib_get_double(h, "longitudeOfFirstGridPointInDegrees", &lon_first_)) != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR,
"grib_nearest_reduced: Unable to get longitudeOfFirstGridPointInDegrees %s\n",
grib_get_error_message(err));
return err;
}
/*TODO longitudeOfLastGridPointInDegrees from the def file*/
if ((err = grib_get_double(h, "longitudeOfLastGridPointInDegrees", &self->lon_last)) != GRIB_SUCCESS) {
if ((err = grib_get_double(h, "longitudeOfLastGridPointInDegrees", &lon_last_)) != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR,
"grib_nearest_reduced: Unable to get longitudeOfLastGridPointInDegrees %s\n",
grib_get_error_message(err));
@ -128,16 +52,11 @@ static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
}
}
return 0;
return ret;
}
typedef void (*get_reduced_row_proc)(long pl, double lon_first, double lon_last, long* npoints, long* ilon_first, long* ilon_last);
static int find_global(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len);
static int is_legacy(grib_handle* h, int* legacy)
{
int err = 0;
@ -159,21 +78,20 @@ static int is_rotated(grib_handle* h, int* rotated)
return GRIB_SUCCESS;
}
static int find(grib_nearest* nearest, grib_handle* h,
int Reduced::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
int err = 0;
grib_nearest_reduced* self = (grib_nearest_reduced*)nearest;
if (self->rotated == -1 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
err = is_rotated(h, &(self->rotated));
if (rotated_ == -1 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
err = is_rotated(h, &(rotated_));
if (err) return err;
}
if (self->global && self->rotated == 0) {
err = find_global(nearest, h,
if (global_ && rotated_ == 0) {
err = find_global( h,
inlat, inlon, flags,
outlats, outlons, values,
distances, indexes, len);
@ -186,13 +104,13 @@ static int find(grib_nearest* nearest, grib_handle* h,
int lons_count = 0; /*dummy*/
err = grib_nearest_find_generic(
nearest, h, inlat, inlon, flags,
self->values_key,
&(self->lats),
&(self->lats_count),
&(self->lons),
h, inlat, inlon, flags,
values_key_,
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count),
&(self->distances),
&(distances_),
outlats, outlons,
values, distances, indexes, len);
}
@ -200,12 +118,11 @@ static int find(grib_nearest* nearest, grib_handle* h,
}
/* Old implementation in src/deprecated/grib_nearest_class_reduced.old */
static int find_global(grib_nearest* nearest, grib_handle* h,
int Reduced::find_global(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
grib_nearest_reduced* self = (grib_nearest_reduced*)nearest;
int err = 0, kk = 0, ii = 0;
size_t jj = 0;
long* pla = NULL;
@ -217,17 +134,17 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
int ilat = 0, ilon = 0;
get_reduced_row_proc get_reduced_row_func = &grib_get_reduced_row;
if (self->legacy == -1 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
err = is_legacy(h, &(self->legacy));
if (legacy_ == -1 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
err = is_legacy(h, &(legacy_));
if (err) return err;
}
if (self->legacy == 1) {
if (legacy_ == 1) {
get_reduced_row_func = &grib_get_reduced_row_legacy;
}
if ((err = grib_get_size(h, self->values_key, &nvalues)) != GRIB_SUCCESS)
if ((err = grib_get_size(h, values_key_, &nvalues)) != GRIB_SUCCESS)
return err;
nearest->values_count = nvalues;
values_count_ = nvalues;
if ((err = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return err;
@ -235,31 +152,31 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
/* Compute lat/lon info, create iterator etc if it's the 1st time or different grid.
* This is for performance: if the grid has not changed, we only do this once
* and reuse for other messages */
if (!nearest->h || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
if (!h_ || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double olat = 1.e10;
long n = 0;
ilat = 0;
ilon = 0;
if (grib_is_missing(h, self->Nj, &err)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", self->Nj);
if (grib_is_missing(h, Nj_, &err)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", Nj_);
return err ? err : GRIB_GEOCALCULUS_PROBLEM;
}
if ((err = grib_get_long(h, self->Nj, &n)) != GRIB_SUCCESS)
if ((err = grib_get_long(h, Nj_, &n)) != GRIB_SUCCESS)
return err;
self->lats_count = n;
lats_count_ = n;
if (self->lats)
grib_context_free(h->context, self->lats);
self->lats = (double*)grib_context_malloc(h->context, self->lats_count * sizeof(double));
if (!self->lats)
if (lats_)
grib_context_free(h->context, lats_);
lats_ = (double*)grib_context_malloc(h->context, lats_count_ * sizeof(double));
if (!lats_)
return GRIB_OUT_OF_MEMORY;
if (self->lons)
grib_context_free(h->context, self->lons);
self->lons = (double*)grib_context_malloc(h->context, nearest->values_count * sizeof(double));
if (!self->lons)
if (lons_)
grib_context_free(h->context, lons_);
lons_ = (double*)grib_context_malloc(h->context, values_count_ * sizeof(double));
if (!lons_)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, GRIB_GEOITERATOR_NO_VALUES, &err);
@ -268,29 +185,29 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
return err;
}
while (grib_iterator_next(iter, &lat, &lon, NULL)) {
if (ilat < self->lats_count && olat != lat) {
self->lats[ilat++] = lat;
if (ilat < lats_count_ && olat != lat) {
lats_[ilat++] = lat;
olat = lat;
}
while (lon > 360)
lon -= 360;
if (!self->global) { /* ECC-756 */
if (self->legacy == 0) /*TODO*/
if (!global_) { /* ECC-756 */
if (legacy_ == 0) /*TODO*/
if (lon > 180 && lon < 360)
lon -= 360;
}
DEBUG_ASSERT_ACCESS(self->lons, (long)ilon, (long)nearest->values_count);
self->lons[ilon++] = lon;
DEBUG_ASSERT_ACCESS(lons_, (long)ilon, (long)values_count_);
lons_[ilon++] = lon;
}
self->lats_count = ilat;
lats_count_ = ilat;
grib_iterator_delete(iter);
}
nearest->h = h;
h_ = h;
/* Compute distances if it's the 1st time or different point or different grid.
* This is for performance: if the grid and the input point have not changed
* we only do this once and reuse for other messages */
if (!self->distances || (flags & GRIB_NEAREST_SAME_POINT) == 0 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
if (!distances_ || (flags & GRIB_NEAREST_SAME_POINT) == 0 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double* lons = NULL;
int nlon = 0;
size_t plsize = 0;
@ -298,40 +215,40 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
int nearest_lons_found = 0;
long row_count, ilon_first, ilon_last;
if (self->global) {
if (global_) {
inlon = normalise_longitude_in_degrees(inlon);
}
else {
/* TODO: Experimental */
if (self->legacy == 0)
if (legacy_ == 0)
if (inlon > 180 && inlon < 360)
inlon -= 360;
}
ilat = self->lats_count;
if (self->lats[ilat - 1] > self->lats[0]) {
if (inlat < self->lats[0] || inlat > self->lats[ilat - 1])
ilat = lats_count_;
if (lats_[ilat - 1] > lats_[0]) {
if (inlat < lats_[0] || inlat > lats_[ilat - 1])
return GRIB_OUT_OF_AREA;
}
else {
if (inlat > self->lats[0] || inlat < self->lats[ilat - 1])
if (inlat > lats_[0] || inlat < lats_[ilat - 1])
return GRIB_OUT_OF_AREA;
}
if (!self->distances)
self->distances = (double*)grib_context_malloc(h->context, NUM_NEIGHBOURS * sizeof(double));
if (!self->distances)
if (!distances_)
distances_ = (double*)grib_context_malloc(h->context, NUM_NEIGHBOURS * sizeof(double));
if (!distances_)
return GRIB_OUT_OF_MEMORY;
grib_binary_search(self->lats, ilat - 1, inlat, &(self->j[0]), &(self->j[1]));
grib_binary_search(lats_, ilat - 1, inlat, &(j_[0]), &(j_[1]));
plsize = self->lats_count;
if ((err = grib_get_size(h, self->pl, &plsize)) != GRIB_SUCCESS)
plsize = lats_count_;
if ((err = grib_get_size(h, pl_, &plsize)) != GRIB_SUCCESS)
return err;
pla = (long*)grib_context_malloc(h->context, plsize * sizeof(long));
if (!pla)
return GRIB_OUT_OF_MEMORY;
if ((err = grib_get_long_array(h, self->pl, pla, &plsize)) != GRIB_SUCCESS)
if ((err = grib_get_long_array(h, pl_, pla, &plsize)) != GRIB_SUCCESS)
return err;
pl = pla;
@ -340,27 +257,27 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
}
nlon = 0;
if (self->global) {
for (jj = 0; jj < self->j[0]; jj++)
if (global_) {
for (jj = 0; jj < j_[0]; jj++)
nlon += pl[jj];
nplm1 = pl[self->j[0]] - 1;
nplm1 = pl[j_[0]] - 1;
}
else {
nlon = 0;
for (jj = 0; jj < self->j[0]; jj++) {
for (jj = 0; jj < j_[0]; jj++) {
row_count = 0;
ilon_first = 0;
ilon_last = 0;
get_reduced_row_func(pl[jj], self->lon_first, self->lon_last, &row_count, &ilon_first, &ilon_last);
get_reduced_row_func(pl[jj], lon_first_, lon_last_, &row_count, &ilon_first, &ilon_last);
nlon += row_count;
}
row_count = 0;
ilon_first = 0;
ilon_last = 0;
get_reduced_row_func(pl[self->j[0]], self->lon_first, self->lon_last, &row_count, &ilon_first, &ilon_last);
get_reduced_row_func(pl[j_[0]], lon_first_, lon_last_, &row_count, &ilon_first, &ilon_last);
nplm1 = row_count - 1;
}
lons = self->lons + nlon;
lons = lons_ + nlon;
nearest_lons_found = 0;
/* ECC-756: The comparisons of longitudes here depends on the longitude values
@ -371,8 +288,8 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
if (lons[nplm1] > lons[0]) {
if (inlon < lons[0] || inlon > lons[nplm1]) {
if (lons[nplm1] - lons[0] - 360 <= lons[nplm1] - lons[nplm1 - 1]) {
self->k[0] = 0;
self->k[1] = nplm1;
k_[0] = 0;
k_[1] = nplm1;
nearest_lons_found = 1;
}
else
@ -382,8 +299,8 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
else {
if (inlon > lons[0] || inlon < lons[nplm1]) {
if (lons[0] - lons[nplm1] - 360 <= lons[0] - lons[1]) {
self->k[0] = 0;
self->k[1] = nplm1;
k_[0] = 0;
k_[1] = nplm1;
nearest_lons_found = 1;
}
else
@ -392,51 +309,51 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
}
if (!nearest_lons_found) {
if (!self->global) {
if (!global_) {
row_count = 0;
ilon_first = 0;
ilon_last = 0;
get_reduced_row_func(pl[self->j[0]], self->lon_first, self->lon_last, &row_count, &ilon_first, &ilon_last);
get_reduced_row_func(pl[j_[0]], lon_first_, lon_last_, &row_count, &ilon_first, &ilon_last);
}
else {
row_count = pl[self->j[0]];
row_count = pl[j_[0]];
}
grib_binary_search(lons, row_count - 1, inlon,
&(self->k[0]), &(self->k[1]));
&(k_[0]), &(k_[1]));
}
self->k[0] += nlon;
self->k[1] += nlon;
k_[0] += nlon;
k_[1] += nlon;
nlon = 0;
if (self->global) {
for (jj = 0; jj < self->j[1]; jj++)
if (global_) {
for (jj = 0; jj < j_[1]; jj++)
nlon += pl[jj];
nplm1 = pl[self->j[1]] - 1;
nplm1 = pl[j_[1]] - 1;
}
else {
for (jj = 0; jj < self->j[1]; jj++) {
for (jj = 0; jj < j_[1]; jj++) {
row_count = 0;
ilon_first = 0;
ilon_last = 0;
get_reduced_row_func(pl[jj], self->lon_first, self->lon_last, &row_count, &ilon_first, &ilon_last);
get_reduced_row_func(pl[jj], lon_first_, lon_last_, &row_count, &ilon_first, &ilon_last);
nlon += row_count;
}
row_count = 0;
ilon_first = 0;
ilon_last = 0;
get_reduced_row_func(pl[self->j[1]], self->lon_first, self->lon_last, &nplm1, &ilon_first, &ilon_last);
get_reduced_row_func(pl[j_[1]], lon_first_, lon_last_, &nplm1, &ilon_first, &ilon_last);
nplm1--;
}
lons = self->lons + nlon;
lons = lons_ + nlon;
nearest_lons_found = 0;
if (lons[nplm1] > lons[0]) {
if (inlon < lons[0] || inlon > lons[nplm1]) {
if (lons[nplm1] - lons[0] - 360 <=
lons[nplm1] - lons[nplm1 - 1]) {
self->k[2] = 0;
self->k[3] = nplm1;
k_[2] = 0;
k_[3] = nplm1;
nearest_lons_found = 1;
}
else
@ -447,8 +364,8 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
if (inlon > lons[0] || inlon < lons[nplm1]) {
if (lons[0] - lons[nplm1] - 360 <=
lons[0] - lons[1]) {
self->k[2] = 0;
self->k[3] = nplm1;
k_[2] = 0;
k_[3] = nplm1;
nearest_lons_found = 1;
}
else
@ -457,28 +374,28 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
}
if (!nearest_lons_found) {
if (!self->global) {
if (!global_) {
row_count = 0;
ilon_first = 0;
ilon_last = 0;
get_reduced_row_func(pl[self->j[1]], self->lon_first, self->lon_last, &row_count, &ilon_first, &ilon_last);
get_reduced_row_func(pl[j_[1]], lon_first_, lon_last_, &row_count, &ilon_first, &ilon_last);
}
else {
row_count = pl[self->j[1]];
row_count = pl[j_[1]];
}
grib_binary_search(lons, row_count - 1, inlon,
&(self->k[2]), &(self->k[3]));
&(k_[2]), &(k_[3]));
}
self->k[2] += nlon;
self->k[3] += nlon;
k_[2] += nlon;
k_[3] += nlon;
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
self->distances[kk] = geographic_distance_spherical(radiusInKm, inlon, inlat,
self->lons[self->k[kk]], self->lats[self->j[jj]]);
distances_[kk] = geographic_distance_spherical(radiusInKm, inlon, inlat,
lons_[k_[kk]], lats_[j_[jj]]);
kk++;
}
}
@ -490,24 +407,24 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
if (values) {
/* See ECC-1403 and ECC-499 */
/* Performance: Decode the field once and get all 4 values */
err = grib_get_double_element_set(h, self->values_key, self->k, NUM_NEIGHBOURS, values);
err = grib_get_double_element_set(h, values_key_, k_, NUM_NEIGHBOURS, values);
if (err != GRIB_SUCCESS) return err;
}
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
distances[kk] = self->distances[kk];
outlats[kk] = self->lats[self->j[jj]];
outlons[kk] = self->lons[self->k[kk]];
distances[kk] = distances_[kk];
outlats[kk] = lats_[j_[jj]];
outlons[kk] = lons_[k_[kk]];
/*if (values) {
* grib_get_double_element_internal(h, self->values_key, self->k[kk], &(values[kk]));
* grib_get_double_element_internal(h, values_key_, k_[kk], &(values[kk]));
*}
*/
if (self->k[kk] >= INT_MAX) {
if (k_[kk] >= INT_MAX) {
/* Current interface uses an 'int' for 'indexes' which is 32bits! We should change this to a 64bit type */
grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_reduced: Unable to compute index. Value too large");
return GRIB_OUT_OF_RANGE;
} else {
indexes[kk] = (int)self->k[kk];
indexes[kk] = (int)k_[kk];
}
kk++;
}
@ -516,16 +433,4 @@ static int find_global(grib_nearest* nearest, grib_handle* h,
return GRIB_SUCCESS;
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_reduced* self = (grib_nearest_reduced*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,40 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class Reduced : public Gen {
public:
Reduced() {
class_name_ = "reduced";
}
Nearest* create() override { return new Reduced(); }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
private:
const char* pl_ = nullptr;
long global_ = 0.0;
double lon_first_ = 0.0;
double lon_last_ = 0.0;
int legacy_ = 0;
int rotated_ = 0;
int find_global(grib_handle*,
double, double, unsigned long,
double*, double*, double*,
double*, int*, size_t*);
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,288 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_regular.h"
eccodes::geo_nearest::Regular _grib_nearest_regular{};
eccodes::geo_nearest::Nearest* grib_nearest_regular = &_grib_nearest_regular;
namespace eccodes::geo_nearest {
#define NUM_NEIGHBOURS 4
int Regular::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
static bool is_rotated_grid(grib_handle* h)
{
long is_rotated = 0;
int err = grib_get_long(h, "isRotatedGrid", &is_rotated);
if (!err && is_rotated)
return true;
return false;
}
// Old implementation in
// src/deprecated/grib_nearest_class_regular.cc
//
int Regular::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
int ret = 0, kk = 0, ii = 0, jj = 0;
size_t nvalues = 0;
double radiusInKm;
grib_iterator* iter = NULL;
double lat = 0, lon = 0;
const bool is_rotated = is_rotated_grid(h);
double angleOfRotation = 0, southPoleLat = 0, southPoleLon = 0;
grib_context* c = h->context;
while (inlon < 0)
inlon += 360;
while (inlon > 360)
inlon -= 360;
if ((ret = grib_get_size(h, values_key_, &nvalues)) != GRIB_SUCCESS)
return ret;
values_count_ = nvalues;
if ((ret = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return ret;
/* Compute lat/lon info, create iterator etc if it's the 1st time or different grid.
* This is for performance: if the grid has not changed, we only do this once
* and reuse for other messages */
if (!h_ || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double olat = 1.e10, olon = 1.e10;
int ilat = 0, ilon = 0;
long n = 0;
if (grib_is_missing(h, Ni_, &ret)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", Ni_);
return ret ? ret : GRIB_GEOCALCULUS_PROBLEM;
}
if (grib_is_missing(h, Nj_, &ret)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", Nj_);
return ret ? ret : GRIB_GEOCALCULUS_PROBLEM;
}
/* ECC-600: Support for rotated grids
* First: rotate the input point
* Then: run the lat/lon iterator over the rotated grid (disableUnrotate)
* Finally: unrotate the resulting point
*/
if (is_rotated) {
double new_lat = 0, new_lon = 0;
ret = grib_get_double_internal(h, "angleOfRotation", &angleOfRotation);
if (ret)
return ret;
ret = grib_get_double_internal(h, "latitudeOfSouthernPoleInDegrees", &southPoleLat);
if (ret)
return ret;
ret = grib_get_double_internal(h, "longitudeOfSouthernPoleInDegrees", &southPoleLon);
if (ret)
return ret;
ret = grib_set_long(h, "iteratorDisableUnrotate", 1);
if (ret)
return ret;
/* Rotate the inlat, inlon */
rotate(inlat, inlon, angleOfRotation, southPoleLat, southPoleLon, &new_lat, &new_lon);
inlat = new_lat;
inlon = new_lon;
/*if(h->context->debug) printf("nearest find: rotated grid: new point=(%g,%g)\n",new_lat,new_lon);*/
}
if ((ret = grib_get_long(h, Ni_, &n)) != GRIB_SUCCESS)
return ret;
lons_count_ = n;
if ((ret = grib_get_long(h, Nj_, &n)) != GRIB_SUCCESS)
return ret;
lats_count_ = n;
if (lats_)
grib_context_free(c, lats_);
lats_ = (double*)grib_context_malloc(c, lats_count_ * sizeof(double));
if (!lats_)
return GRIB_OUT_OF_MEMORY;
if (lons_)
grib_context_free(c, lons_);
lons_ = (double*)grib_context_malloc(c, lons_count_ * sizeof(double));
if (!lons_)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, GRIB_GEOITERATOR_NO_VALUES, &ret);
if (ret != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_regular: Unable to create lat/lon iterator");
return ret;
}
while (grib_iterator_next(iter, &lat, &lon, NULL)) {
if (ilat < lats_count_ && olat != lat) {
lats_[ilat++] = lat;
olat = lat;
}
if (ilon < lons_count_ && olon != lon) {
lons_[ilon++] = lon;
olon = lon;
}
}
grib_iterator_delete(iter);
}
h_ = h;
/* Compute distances if it's the 1st time or different point or different grid.
* This is for performance: if the grid and the input point have not changed
* we only do this once and reuse for other messages */
if (!distances_ || (flags & GRIB_NEAREST_SAME_POINT) == 0 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
int nearest_lons_found = 0;
if (lats_[lats_count_ - 1] > lats_[0]) {
if (inlat < lats_[0] || inlat > lats_[lats_count_ - 1])
return GRIB_OUT_OF_AREA;
}
else {
if (inlat > lats_[0] || inlat < lats_[lats_count_ - 1])
return GRIB_OUT_OF_AREA;
}
if (lons_[lons_count_ - 1] > lons_[0]) {
if (inlon < lons_[0] || inlon > lons_[lons_count_ - 1]) {
/* try to scale*/
if (inlon > 0)
inlon -= 360;
else
inlon += 360;
if (inlon < lons_[0] || inlon > lons_[lons_count_ - 1]) {
if (lons_[0] + 360 - lons_[lons_count_ - 1] <=
lons_[1] - lons_[0]) {
/*it's a global field in longitude*/
i_[0] = 0;
i_[1] = lons_count_ - 1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
}
else {
if (inlon > lons_[0] || inlon < lons_[lons_count_ - 1]) {
/* try to scale*/
if (inlon > 0)
inlon -= 360;
else
inlon += 360;
if (lons_[0] - lons_[lons_count_ - 1] - 360 <=
lons_[0] - lons_[1]) {
/*it's a global field in longitude*/
i_[0] = 0;
i_[1] = lons_count_ - 1;
nearest_lons_found = 1;
}
else if (inlon > lons_[0] || inlon < lons_[lons_count_ - 1])
return GRIB_OUT_OF_AREA;
}
}
grib_binary_search(lats_, lats_count_ - 1, inlat,
&(j_[0]), &(j_[1]));
if (!nearest_lons_found)
grib_binary_search(lons_, lons_count_ - 1, inlon,
&(i_[0]), &(i_[1]));
if (!distances_)
distances_ = (double*)grib_context_malloc(c, NUM_NEIGHBOURS * sizeof(double));
if (!k_)
k_ = (size_t*)grib_context_malloc(c, NUM_NEIGHBOURS * sizeof(size_t));
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
k_[kk] = i_[ii] + lons_count_ * j_[jj];
distances_[kk] = geographic_distance_spherical(radiusInKm, inlon, inlat,
lons_[i_[ii]], lats_[j_[jj]]);
kk++;
}
}
}
kk = 0;
/*
* Brute force algorithm:
* First unpack all the values into an array. Then when we need the 4 points
* we just index into this array so no need to call grib_get_double_element_internal
*
* if (nearest->values) grib_context_free(c,nearest->values);
* nearest->values = grib_context_malloc(h->context,nvalues*sizeof(double));
* if (!nearest->values) return GRIB_OUT_OF_MEMORY;
* ret = grib_get_double_array(h, values_key_, nearest->values ,&nvalues);
* if (ret) return ret;
*/
if (values) {
/* See ECC-1403 and ECC-499 */
/* Performance: Decode the field once and get all 4 values */
if ((ret = grib_get_double_element_set(h, values_key_, k_, NUM_NEIGHBOURS, values)) != GRIB_SUCCESS)
return ret;
}
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
distances[kk] = distances_[kk];
outlats[kk] = lats_[j_[jj]];
outlons[kk] = lons_[i_[ii]];
if (is_rotated) {
/* Unrotate resulting lat/lon */
double new_lat = 0, new_lon = 0;
unrotate(outlats[kk], outlons[kk], angleOfRotation, southPoleLat, southPoleLon, &new_lat, &new_lon);
outlats[kk] = new_lat;
outlons[kk] = new_lon;
}
/* See ECC-1403 and ECC-499
* if (values) {
* grib_get_double_element_internal(h, values_key_, k_[kk], &(values[kk]));
*}
*/
/* Using the brute force approach described above */
/* Assert(k_[kk] < nvalues); */
/* values[kk]=nearest->values[k_[kk]]; */
if (k_[kk] >= INT_MAX) {
/* Current interface uses an 'int' for 'indexes' which is 32bits! We should change this to a 64bit type */
grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_regular: Unable to compute index. Value too large");
return GRIB_OUT_OF_RANGE;
} else {
indexes[kk] = (int)k_[kk];
}
kk++;
}
}
return GRIB_SUCCESS;
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class Regular : public Gen {
public:
Regular() {
class_name_ = "regular";
}
Nearest* create() override { return new Regular(); }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,51 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_nearest_class_space_view.h"
eccodes::geo_nearest::SpaceView _grib_nearest_space_view{};
eccodes::geo_nearest::Nearest* grib_nearest_space_view = &_grib_nearest_space_view;
namespace eccodes::geo_nearest {
int SpaceView::init(grib_handle* h, grib_arguments* args)
{
int ret = GRIB_SUCCESS;
if ((ret = Gen::init(h, args) != GRIB_SUCCESS))
return ret;
Ni_ = grib_arguments_get_name(h, args, cargs_++);
Nj_ = grib_arguments_get_name(h, args, cargs_++);
i_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
j_ = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return ret;
}
int SpaceView::find(grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
return grib_nearest_find_generic(
h, inlat, inlon, flags, /* inputs */
values_key_, /* outputs to set the 'self' object */
&(lats_),
&(lats_count_),
&(lons_),
&(lons_count_),
&(distances_),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
} // namespace eccodes::geo_nearest

View File

@ -0,0 +1,27 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_nearest_class_gen.h"
namespace eccodes::geo_nearest {
class SpaceView : public Gen {
public:
SpaceView() {
class_name_ = "space_view";
}
Nearest* create() override { return new SpaceView(); }
int init(grib_handle*, grib_arguments*) override;
int find(grib_handle*, double, double, unsigned long, double*, double*, double*, double*, int*, size_t*) override;
};
} // namespace eccodes::geo_nearest

View File

@ -256,7 +256,6 @@ typedef struct grib_iterator {
eccodes::geo_iterator::Iterator* iterator;
} grib_iterator;
typedef struct grib_nearest_class grib_nearest_class;
typedef struct grib_dumper grib_dumper;
typedef struct grib_dumper_class grib_dumper_class;
typedef struct grib_dependency grib_dependency;
@ -264,16 +263,6 @@ typedef struct grib_dependency grib_dependency;
typedef struct codes_condition codes_condition;
/* typedef void (*dynamic_key_proc) (const char*, void*) */
typedef void (*nearest_init_class_proc)(grib_nearest_class*);
typedef int (*nearest_init_proc)(grib_nearest* i, grib_handle*, grib_arguments*);
typedef int (*nearest_find_proc)(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon,
unsigned long flags, double* outlats,
double* outlons, double* values,
double* distances, int* indexes, size_t* len);
typedef int (*nearest_destroy_proc)(grib_nearest* nearest);
typedef int (*grib_pack_proc)(grib_handle* h, const double* in, size_t inlen, void* out, size_t* outlen);
typedef int (*grib_unpack_proc)(grib_handle* h, const void* in, size_t inlen, double* out, size_t* outlen);
@ -458,17 +447,13 @@ struct grib_section
size_t padding;
};
struct grib_nearest_class
{
grib_nearest_class** super;
const char* name;
size_t size;
int inited;
nearest_init_class_proc init_class;
nearest_init_proc init;
nearest_destroy_proc destroy;
nearest_find_proc find;
};
namespace eccodes::geo_nearest {
class Nearest;
}
typedef struct grib_nearest {
eccodes::geo_nearest::Nearest* nearest;
} grib_nearest;
/* --------------- */
typedef int (*dumper_init_proc)(grib_dumper*);
@ -513,15 +498,6 @@ struct grib_dumper_class
dumper_footer_proc footer;
};
struct grib_nearest
{
grib_handle* h;
double* values;
size_t values_count;
grib_nearest_class* cclass;
unsigned long flags;
};
struct grib_dependency
{
grib_dependency* next;
@ -1243,13 +1219,14 @@ typedef struct j2k_encode_helper
} j2k_encode_helper;
#include "eccodes_prototypes.h"
#include "eccodes_prototypes.h"
#ifdef __cplusplus
}
#include "accessor/grib_accessor.h"
#include "accessor/grib_accessors_list.h"
#include "geo_iterator/grib_iterator.h"
#include "geo_nearest/grib_nearest.h"
#endif
#endif

View File

@ -822,6 +822,9 @@ static int read_BUFR(reader* r, int no_alloc)
if (sec3len < 5) {
return GRIB_INVALID_MESSAGE; // ECC-1778
}
if (sec3len > 10'000'000) {
return GRIB_INVALID_MESSAGE; // ECC-1938
}
if ((r->read(r->read_data, tmp + i, sec3len - 3, &err) != sec3len - 3) || err)
return err;
i += sec3len - 3;

View File

@ -1,13 +0,0 @@
/* This file is automatically generated by ./make_class.pl, do not edit */
extern eccodes::geo_iterator::Iterator* grib_iterator_gaussian;
extern eccodes::geo_iterator::Iterator* grib_iterator_gaussian_reduced;
//extern eccodes::geo_iterator::Iterator* grib_iterator_gen;
extern eccodes::geo_iterator::Iterator* grib_iterator_healpix;
extern eccodes::geo_iterator::Iterator* grib_iterator_lambert_azimuthal_equal_area;
extern eccodes::geo_iterator::Iterator* grib_iterator_lambert_conformal;
extern eccodes::geo_iterator::Iterator* grib_iterator_latlon;
extern eccodes::geo_iterator::Iterator* grib_iterator_latlon_reduced;
extern eccodes::geo_iterator::Iterator* grib_iterator_mercator;
extern eccodes::geo_iterator::Iterator* grib_iterator_polar_stereographic;
extern eccodes::geo_iterator::Iterator* grib_iterator_regular;
extern eccodes::geo_iterator::Iterator* grib_iterator_space_view;

View File

@ -8,18 +8,9 @@
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
/***************************************************************************
* Jean Baptiste Filippi - 01.11.2005 *
* Enrico Fucile *
***************************************************************************/
#include "grib_api_internal.h"
#include "geo_iterator/grib_iterator.h"
#include "grib_iterator_factory.h"
#include "accessor/grib_accessor_class_iterator.h"
/* This file is generated by ./make_class.pl */
#include "grib_iterator_class.h"
#if GRIB_PTHREADS
static pthread_once_t once = PTHREAD_ONCE_INIT;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
@ -55,11 +46,20 @@ struct table_entry
};
static const struct table_entry table[] = {
/* This file is generated by ./make_class.pl */
#include "grib_iterator_factory.h"
{ "gaussian", &grib_iterator_gaussian, },
{ "gaussian_reduced", &grib_iterator_gaussian_reduced, },
{ "healpix", &grib_iterator_healpix, },
{ "lambert_azimuthal_equal_area", &grib_iterator_lambert_azimuthal_equal_area, },
{ "lambert_conformal", &grib_iterator_lambert_conformal, },
{ "latlon", &grib_iterator_latlon, },
{ "latlon_reduced", &grib_iterator_latlon_reduced, },
{ "mercator", &grib_iterator_mercator, },
{ "polar_stereographic", &grib_iterator_polar_stereographic, },
{ "regular", &grib_iterator_regular, },
{ "space_view", &grib_iterator_space_view, },
{ "unstructured", &grib_iterator_unstructured, },
};
eccodes::geo_iterator::Iterator* grib_iterator_factory(grib_handle* h, grib_arguments* args, unsigned long flags, int* error)
{
size_t i = 0, num_table_entries = 0;

View File

@ -1,13 +1,30 @@
/* This file is automatically generated by ./make.pl, do not edit */
{ "gaussian", &grib_iterator_gaussian, },
{ "gaussian_reduced", &grib_iterator_gaussian_reduced, },
//{ "gen", &grib_iterator_gen, },
{ "healpix", &grib_iterator_healpix, },
{ "lambert_azimuthal_equal_area", &grib_iterator_lambert_azimuthal_equal_area, },
{ "lambert_conformal", &grib_iterator_lambert_conformal, },
{ "latlon", &grib_iterator_latlon, },
{ "latlon_reduced", &grib_iterator_latlon_reduced, },
{ "mercator", &grib_iterator_mercator, },
{ "polar_stereographic", &grib_iterator_polar_stereographic, },
{ "regular", &grib_iterator_regular, },
{ "space_view", &grib_iterator_space_view, },
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_api_internal.h"
#include "geo_iterator/grib_iterator.h"
extern eccodes::geo_iterator::Iterator* grib_iterator_gaussian;
extern eccodes::geo_iterator::Iterator* grib_iterator_gaussian_reduced;
extern eccodes::geo_iterator::Iterator* grib_iterator_healpix;
extern eccodes::geo_iterator::Iterator* grib_iterator_lambert_azimuthal_equal_area;
extern eccodes::geo_iterator::Iterator* grib_iterator_lambert_conformal;
extern eccodes::geo_iterator::Iterator* grib_iterator_latlon;
extern eccodes::geo_iterator::Iterator* grib_iterator_latlon_reduced;
extern eccodes::geo_iterator::Iterator* grib_iterator_mercator;
extern eccodes::geo_iterator::Iterator* grib_iterator_polar_stereographic;
extern eccodes::geo_iterator::Iterator* grib_iterator_regular;
extern eccodes::geo_iterator::Iterator* grib_iterator_space_view;
extern eccodes::geo_iterator::Iterator* grib_iterator_unstructured;
eccodes::geo_iterator::Iterator* grib_iterator_factory(grib_handle* h, grib_arguments* args, unsigned long flags, int* error);

View File

@ -1,11 +0,0 @@
/* This file is automatically generated by ./make_class.pl, do not edit */
extern grib_nearest_class* grib_nearest_class_gen;
extern grib_nearest_class* grib_nearest_class_healpix;
extern grib_nearest_class* grib_nearest_class_lambert_azimuthal_equal_area;
extern grib_nearest_class* grib_nearest_class_lambert_conformal;
extern grib_nearest_class* grib_nearest_class_latlon_reduced;
extern grib_nearest_class* grib_nearest_class_mercator;
extern grib_nearest_class* grib_nearest_class_polar_stereographic;
extern grib_nearest_class* grib_nearest_class_reduced;
extern grib_nearest_class* grib_nearest_class_regular;
extern grib_nearest_class* grib_nearest_class_space_view;

View File

@ -1,102 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
IMPLEMENTS = destroy
IMPLEMENTS = find
IMPLEMENTS = init
MEMBERS = const char* values_key
MEMBERS = const char* radius
MEMBERS = int cargs
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_gen{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
} grib_nearest_gen;
static grib_nearest_class _grib_nearest_class_gen = {
0, /* super */
"gen", /* name */
sizeof(grib_nearest_gen), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_gen = &_grib_nearest_class_gen;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_gen* self = (grib_nearest_gen*)nearest;
int ret = GRIB_SUCCESS;
self->cargs = 1;
self->values_key = grib_arguments_get_name(h, args, self->cargs++);
self->radius = grib_arguments_get_name(h, args, self->cargs++);
nearest->values = NULL;
return ret;
}
static int destroy(grib_nearest* nearest)
{
grib_context* c = grib_context_get_default();
if (nearest->values)
grib_context_free(c, nearest->values);
grib_context_free(c, nearest);
return GRIB_SUCCESS;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
return GRIB_NOT_IMPLEMENTED;
}

View File

@ -1,136 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = int* k
MEMBERS = int* i
MEMBERS = int* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_healpix{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in healpix */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
int* k;
int* i;
int* j;
const char* Ni;
const char* Nj;
} grib_nearest_healpix;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_healpix = {
&grib_nearest_class_gen, /* super */
"healpix", /* name */
sizeof(grib_nearest_healpix), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_healpix = &_grib_nearest_class_healpix;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_healpix* self = (grib_nearest_healpix*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->lats = self->lons = self->distances = NULL;
self->lats_count = self->lons_count = 0;
self->i = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
self->j = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
return GRIB_SUCCESS;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_healpix* self = (grib_nearest_healpix*)nearest;
return grib_nearest_find_generic(
nearest, h, inlat, inlon, flags, /* inputs */
self->values_key, /* outputs to set the 'self' object */
&(self->lats),
&(self->lats_count),
&(self->lons),
&(self->lons_count),
&(self->distances),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_healpix* self = (grib_nearest_healpix*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,134 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = int* k
MEMBERS = int* i
MEMBERS = int* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_lambert_azimuthal_equal_area{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in lambert_azimuthal_equal_area */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
int* k;
int* i;
int* j;
const char* Ni;
const char* Nj;
} grib_nearest_lambert_azimuthal_equal_area;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_lambert_azimuthal_equal_area = {
&grib_nearest_class_gen, /* super */
"lambert_azimuthal_equal_area", /* name */
sizeof(grib_nearest_lambert_azimuthal_equal_area), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_lambert_azimuthal_equal_area = &_grib_nearest_class_lambert_azimuthal_equal_area;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_lambert_azimuthal_equal_area* self = (grib_nearest_lambert_azimuthal_equal_area*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->i = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
self->j = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
return 0;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_lambert_azimuthal_equal_area* self = (grib_nearest_lambert_azimuthal_equal_area*)nearest;
return grib_nearest_find_generic(
nearest, h, inlat, inlon, flags, /* inputs */
self->values_key, /* outputs to set the 'self' object */
&(self->lats),
&(self->lats_count),
&(self->lons),
&(self->lons_count),
&(self->distances),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_lambert_azimuthal_equal_area* self = (grib_nearest_lambert_azimuthal_equal_area*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,134 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = int* k
MEMBERS = int* i
MEMBERS = int* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_lambert_conformal{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in lambert_conformal */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
int* k;
int* i;
int* j;
const char* Ni;
const char* Nj;
} grib_nearest_lambert_conformal;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_lambert_conformal = {
&grib_nearest_class_gen, /* super */
"lambert_conformal", /* name */
sizeof(grib_nearest_lambert_conformal), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_lambert_conformal = &_grib_nearest_class_lambert_conformal;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_lambert_conformal* self = (grib_nearest_lambert_conformal*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->i = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
self->j = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
return 0;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_lambert_conformal* self = (grib_nearest_lambert_conformal*)nearest;
return grib_nearest_find_generic(
nearest, h, inlat, inlon, flags, /* inputs */
self->values_key, /* outputs to set the 'self' object */
&(self->lats),
&(self->lats_count),
&(self->lons),
&(self->lons_count),
&(self->distances),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_lambert_conformal* self = (grib_nearest_lambert_conformal*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,436 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init;destroy;find
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = double* distances
MEMBERS = size_t* k
MEMBERS = size_t* j
MEMBERS = const char* Nj
MEMBERS = const char* pl
MEMBERS = const char* lonFirst
MEMBERS = const char* lonLast
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_latlon_reduced{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in latlon_reduced */
double* lats;
int lats_count;
double* lons;
double* distances;
size_t* k;
size_t* j;
const char* Nj;
const char* pl;
const char* lonFirst;
const char* lonLast;
} grib_nearest_latlon_reduced;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_latlon_reduced = {
&grib_nearest_class_gen, /* super */
"latlon_reduced", /* name */
sizeof(grib_nearest_latlon_reduced), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_latlon_reduced = &_grib_nearest_class_latlon_reduced;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_latlon_reduced* self = (grib_nearest_latlon_reduced*)nearest;
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->pl = grib_arguments_get_name(h, args, self->cargs++);
self->lonFirst = grib_arguments_get_name(h, args, self->cargs++);
self->lonLast = grib_arguments_get_name(h, args, self->cargs++);
self->j = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
if (!self->j)
return GRIB_OUT_OF_MEMORY;
self->k = (size_t*)grib_context_malloc(h->context, 4 * sizeof(size_t));
if (!self->k)
return GRIB_OUT_OF_MEMORY;
return 0;
}
static int find_global(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len);
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
int err = 0;
grib_nearest_latlon_reduced* self = (grib_nearest_latlon_reduced*)nearest;
double lat1, lat2, lon1, lon2;
int is_global = 1;
if (grib_get_double(h, "longitudeFirstInDegrees", &lon1) == GRIB_SUCCESS &&
grib_get_double(h, "longitudeLastInDegrees", &lon2) == GRIB_SUCCESS &&
grib_get_double(h, "latitudeFirstInDegrees", &lat1) == GRIB_SUCCESS &&
grib_get_double(h, "latitudeLastInDegrees", &lat2) == GRIB_SUCCESS)
{
const double difflat = fabs(lat1-lat2);
if (difflat < 180 || lon1 != 0 || lon2 < 359) {
is_global = 0; /* subarea */
}
}
if (is_global) {
err = find_global(nearest, h, inlat, inlon, flags,
outlats, outlons, values,
distances, indexes, len);
}
else
{
int lons_count = 0; /*dummy*/
err = grib_nearest_find_generic(
nearest, h, inlat, inlon, flags,
self->values_key,
&(self->lats),
&(self->lats_count),
&(self->lons),
&(lons_count),
&(self->distances),
outlats, outlons,
values, distances, indexes, len);
}
return err;
}
static int find_global(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons, double* values,
double* distances, int* indexes, size_t* len)
{
grib_nearest_latlon_reduced* self = (grib_nearest_latlon_reduced*)nearest;
int ret = 0, kk = 0, ii = 0, jj = 0;
int j = 0;
long* pla = NULL;
long* pl = NULL;
size_t nvalues = 0;
grib_iterator* iter = NULL;
double lat = 0, lon = 0;
double radiusInKm;
int ilat = 0, ilon = 0;
if ((ret = grib_get_size(h, self->values_key, &nvalues)) != GRIB_SUCCESS)
return ret;
nearest->values_count = nvalues;
if ((ret = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return ret;
/* Compute lat/lon info, create iterator etc if it's the 1st time or different grid.
* This is for performance: if the grid has not changed, we only do this once
* and reuse for other messages */
if (!nearest->h || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double olat = 1.e10;
long n = 0;
ilat = 0;
ilon = 0;
if (grib_is_missing(h, self->Nj, &ret)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", self->Nj);
return ret ? ret : GRIB_GEOCALCULUS_PROBLEM;
}
if ((ret = grib_get_long(h, self->Nj, &n)) != GRIB_SUCCESS)
return ret;
self->lats_count = n;
if (self->lats)
grib_context_free(h->context, self->lats);
self->lats = (double*)grib_context_malloc(h->context,
self->lats_count * sizeof(double));
if (!self->lats)
return GRIB_OUT_OF_MEMORY;
if (self->lons)
grib_context_free(h->context, self->lons);
self->lons = (double*)grib_context_malloc(h->context,
nearest->values_count * sizeof(double));
if (!self->lons)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, GRIB_GEOITERATOR_NO_VALUES, &ret);
if (ret) {
grib_context_log(h->context, GRIB_LOG_ERROR, "Unable to create iterator");
return ret;
}
while (grib_iterator_next(iter, &lat, &lon, NULL)) {
if (ilat < self->lats_count && olat != lat) {
self->lats[ilat++] = lat;
olat = lat;
}
self->lons[ilon++] = lon;
}
self->lats_count = ilat;
grib_iterator_delete(iter);
}
nearest->h = h;
/* Compute distances if it's the 1st time or different point or different grid.
* This is for performance: if the grid and the input point have not changed
* we only do this once and reuse for other messages */
if (!self->distances || (flags & GRIB_NEAREST_SAME_POINT) == 0 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double* lons = NULL;
int nlon = 0;
size_t plsize = 0;
long nplm1 = 0;
int nearest_lons_found = 0;
double lon_first, lon_last;
int islocal = 0;
long plmax;
double dimin;
if ((ret = grib_get_double(h, self->lonFirst, &lon_first)) != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR,
"grib_nearest_latlon_reduced.find(): unable to get %s %s\n", self->lonFirst,
grib_get_error_message(ret));
return ret;
}
if ((ret = grib_get_double(h, self->lonLast, &lon_last)) != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR,
"grib_nearest_latlon_reduced.find(): unable to get %s %s\n", self->lonLast,
grib_get_error_message(ret));
return ret;
}
plsize = self->lats_count;
if ((ret = grib_get_size(h, self->pl, &plsize)) != GRIB_SUCCESS)
return ret;
pla = (long*)grib_context_malloc(h->context, plsize * sizeof(long));
if (!pla)
return GRIB_OUT_OF_MEMORY;
if ((ret = grib_get_long_array(h, self->pl, pla, &plsize)) != GRIB_SUCCESS)
return ret;
pl = pla;
while ((*pl) == 0) {
pl++;
}
plmax = pla[0];
for (j = 0; j < plsize; j++)
if (plmax < pla[j])
plmax = pla[j];
dimin = 360.0 / plmax;
if (360 - fabs(lon_last - lon_first) < 2 * dimin) {
islocal = 0;
}
else {
islocal = 1;
}
if (islocal)
for (j = 0; j < plsize; j++)
pla[j]--;
/* printf("XXXX islocal=%d\n",islocal); */
while (inlon < 0)
inlon += 360;
while (inlon > 360)
inlon -= 360;
ilat = self->lats_count;
if (self->lats[ilat - 1] > self->lats[0]) {
if (inlat < self->lats[0] || inlat > self->lats[ilat - 1])
return GRIB_OUT_OF_AREA;
}
else {
if (inlat > self->lats[0] || inlat < self->lats[ilat - 1])
return GRIB_OUT_OF_AREA;
}
if (!self->distances)
self->distances = (double*)grib_context_malloc(h->context, 4 * sizeof(double));
if (!self->distances)
return GRIB_OUT_OF_MEMORY;
grib_binary_search(self->lats, ilat - 1, inlat,
&(self->j[0]), &(self->j[1]));
nlon = 0;
for (jj = 0; jj < self->j[0]; jj++)
nlon += pl[jj];
nplm1 = pl[self->j[0]] - 1;
lons = self->lons + nlon;
nearest_lons_found = 0;
if (lons[nplm1] > lons[0]) {
if (inlon < lons[0] || inlon > lons[nplm1]) {
if (lons[nplm1] - lons[0] - 360 <=
lons[nplm1] - lons[nplm1 - 1]) {
self->k[0] = 0;
self->k[1] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
else {
if (inlon > lons[0] || inlon < lons[nplm1]) {
if (lons[0] - lons[nplm1] - 360 <=
lons[0] - lons[1]) {
self->k[0] = 0;
self->k[1] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
if (!nearest_lons_found) {
grib_binary_search(lons, pl[self->j[0]] - 1, inlon,
&(self->k[0]), &(self->k[1]));
}
self->k[0] += nlon;
self->k[1] += nlon;
nlon = 0;
for (jj = 0; jj < self->j[1]; jj++)
nlon += pl[jj];
nplm1 = pl[self->j[1]] - 1;
lons = self->lons + nlon;
nearest_lons_found = 0;
if (lons[nplm1] > lons[0]) {
if (inlon < lons[0] || inlon > lons[nplm1]) {
if (lons[nplm1] - lons[0] - 360 <=
lons[nplm1] - lons[nplm1 - 1]) {
self->k[2] = 0;
self->k[3] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
else {
if (inlon > lons[0] || inlon < lons[nplm1]) {
if (lons[0] - lons[nplm1] - 360 <=
lons[0] - lons[1]) {
self->k[2] = 0;
self->k[3] = nplm1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
if (!nearest_lons_found) {
grib_binary_search(lons, pl[self->j[1]] - 1, inlon,
&(self->k[2]), &(self->k[3]));
}
self->k[2] += nlon;
self->k[3] += nlon;
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
self->distances[kk] = geographic_distance_spherical(radiusInKm, inlon, inlat,
self->lons[self->k[kk]], self->lats[self->j[jj]]);
kk++;
}
}
grib_context_free(h->context, pla);
}
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
distances[kk] = self->distances[kk];
outlats[kk] = self->lats[self->j[jj]];
outlons[kk] = self->lons[self->k[kk]];
if (values) { /* ECC-499 */
grib_get_double_element_internal(h, self->values_key, self->k[kk], &(values[kk]));
}
indexes[kk] = (int)self->k[kk];
kk++;
}
}
return GRIB_SUCCESS;
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_latlon_reduced* self = (grib_nearest_latlon_reduced*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats)
grib_context_free(c, self->lats);
if (self->lons)
grib_context_free(c, self->lons);
if (self->j)
grib_context_free(c, self->j);
if (self->k)
grib_context_free(c, self->k);
if (self->distances)
grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,136 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = int* k
MEMBERS = int* i
MEMBERS = int* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_mercator{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in mercator */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
int* k;
int* i;
int* j;
const char* Ni;
const char* Nj;
} grib_nearest_mercator;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_mercator = {
&grib_nearest_class_gen, /* super */
"mercator", /* name */
sizeof(grib_nearest_mercator), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_mercator = &_grib_nearest_class_mercator;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_mercator* self = (grib_nearest_mercator*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->lats = self->lons = self->distances = NULL;
self->lats_count = self->lons_count = 0;
self->i = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
self->j = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
return GRIB_SUCCESS;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_mercator* self = (grib_nearest_mercator*)nearest;
return grib_nearest_find_generic(
nearest, h, inlat, inlon, flags, /* inputs */
self->values_key, /* outputs to set the 'self' object */
&(self->lats),
&(self->lats_count),
&(self->lons),
&(self->lons_count),
&(self->distances),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_mercator* self = (grib_nearest_mercator*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,134 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = int* k
MEMBERS = int* i
MEMBERS = int* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_polar_stereographic{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in polar_stereographic */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
int* k;
int* i;
int* j;
const char* Ni;
const char* Nj;
} grib_nearest_polar_stereographic;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_polar_stereographic = {
&grib_nearest_class_gen, /* super */
"polar_stereographic", /* name */
sizeof(grib_nearest_polar_stereographic), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_polar_stereographic = &_grib_nearest_class_polar_stereographic;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_polar_stereographic* self = (grib_nearest_polar_stereographic*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->i = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
self->j = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
return GRIB_SUCCESS;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_polar_stereographic* self = (grib_nearest_polar_stereographic*)nearest;
return grib_nearest_find_generic(
nearest, h, inlat, inlon, flags, /* inputs */
self->values_key, /* outputs to set the 'self' object */
&(self->lats),
&(self->lats_count),
&(self->lons),
&(self->lons_count),
&(self->distances),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_polar_stereographic* self = (grib_nearest_polar_stereographic*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,373 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = size_t* k
MEMBERS = size_t* i
MEMBERS = size_t* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_regular{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in regular */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
size_t* k;
size_t* i;
size_t* j;
const char* Ni;
const char* Nj;
} grib_nearest_regular;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_regular = {
&grib_nearest_class_gen, /* super */
"regular", /* name */
sizeof(grib_nearest_regular), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_regular = &_grib_nearest_class_regular;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
#define NUM_NEIGHBOURS 4
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_regular* self = (grib_nearest_regular*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->i = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
self->j = (size_t*)grib_context_malloc(h->context, 2 * sizeof(size_t));
return 0;
}
static bool is_rotated_grid(grib_handle* h)
{
long is_rotated = 0;
int err = grib_get_long(h, "isRotatedGrid", &is_rotated);
if (!err && is_rotated)
return true;
return false;
}
// Old implementation in
// src/deprecated/grib_nearest_class_regular.cc
//
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_regular* self = (grib_nearest_regular*)nearest;
int ret = 0, kk = 0, ii = 0, jj = 0;
size_t nvalues = 0;
double radiusInKm;
grib_iterator* iter = NULL;
double lat = 0, lon = 0;
const bool is_rotated = is_rotated_grid(h);
double angleOfRotation = 0, southPoleLat = 0, southPoleLon = 0;
grib_context* c = h->context;
while (inlon < 0)
inlon += 360;
while (inlon > 360)
inlon -= 360;
if ((ret = grib_get_size(h, self->values_key, &nvalues)) != GRIB_SUCCESS)
return ret;
nearest->values_count = nvalues;
if ((ret = grib_nearest_get_radius(h, &radiusInKm)) != GRIB_SUCCESS)
return ret;
/* Compute lat/lon info, create iterator etc if it's the 1st time or different grid.
* This is for performance: if the grid has not changed, we only do this once
* and reuse for other messages */
if (!nearest->h || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
double olat = 1.e10, olon = 1.e10;
int ilat = 0, ilon = 0;
long n = 0;
if (grib_is_missing(h, self->Ni, &ret)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", self->Ni);
return ret ? ret : GRIB_GEOCALCULUS_PROBLEM;
}
if (grib_is_missing(h, self->Nj, &ret)) {
grib_context_log(h->context, GRIB_LOG_DEBUG, "Key '%s' is missing", self->Nj);
return ret ? ret : GRIB_GEOCALCULUS_PROBLEM;
}
/* ECC-600: Support for rotated grids
* First: rotate the input point
* Then: run the lat/lon iterator over the rotated grid (disableUnrotate)
* Finally: unrotate the resulting point
*/
if (is_rotated) {
double new_lat = 0, new_lon = 0;
ret = grib_get_double_internal(h, "angleOfRotation", &angleOfRotation);
if (ret)
return ret;
ret = grib_get_double_internal(h, "latitudeOfSouthernPoleInDegrees", &southPoleLat);
if (ret)
return ret;
ret = grib_get_double_internal(h, "longitudeOfSouthernPoleInDegrees", &southPoleLon);
if (ret)
return ret;
ret = grib_set_long(h, "iteratorDisableUnrotate", 1);
if (ret)
return ret;
/* Rotate the inlat, inlon */
rotate(inlat, inlon, angleOfRotation, southPoleLat, southPoleLon, &new_lat, &new_lon);
inlat = new_lat;
inlon = new_lon;
/*if(h->context->debug) printf("nearest find: rotated grid: new point=(%g,%g)\n",new_lat,new_lon);*/
}
if ((ret = grib_get_long(h, self->Ni, &n)) != GRIB_SUCCESS)
return ret;
self->lons_count = n;
if ((ret = grib_get_long(h, self->Nj, &n)) != GRIB_SUCCESS)
return ret;
self->lats_count = n;
if (self->lats)
grib_context_free(c, self->lats);
self->lats = (double*)grib_context_malloc(c, self->lats_count * sizeof(double));
if (!self->lats)
return GRIB_OUT_OF_MEMORY;
if (self->lons)
grib_context_free(c, self->lons);
self->lons = (double*)grib_context_malloc(c, self->lons_count * sizeof(double));
if (!self->lons)
return GRIB_OUT_OF_MEMORY;
iter = grib_iterator_new(h, GRIB_GEOITERATOR_NO_VALUES, &ret);
if (ret != GRIB_SUCCESS) {
grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_regular: Unable to create lat/lon iterator");
return ret;
}
while (grib_iterator_next(iter, &lat, &lon, NULL)) {
if (ilat < self->lats_count && olat != lat) {
self->lats[ilat++] = lat;
olat = lat;
}
if (ilon < self->lons_count && olon != lon) {
self->lons[ilon++] = lon;
olon = lon;
}
}
grib_iterator_delete(iter);
}
nearest->h = h;
/* Compute distances if it's the 1st time or different point or different grid.
* This is for performance: if the grid and the input point have not changed
* we only do this once and reuse for other messages */
if (!self->distances || (flags & GRIB_NEAREST_SAME_POINT) == 0 || (flags & GRIB_NEAREST_SAME_GRID) == 0) {
int nearest_lons_found = 0;
if (self->lats[self->lats_count - 1] > self->lats[0]) {
if (inlat < self->lats[0] || inlat > self->lats[self->lats_count - 1])
return GRIB_OUT_OF_AREA;
}
else {
if (inlat > self->lats[0] || inlat < self->lats[self->lats_count - 1])
return GRIB_OUT_OF_AREA;
}
if (self->lons[self->lons_count - 1] > self->lons[0]) {
if (inlon < self->lons[0] || inlon > self->lons[self->lons_count - 1]) {
/* try to scale*/
if (inlon > 0)
inlon -= 360;
else
inlon += 360;
if (inlon < self->lons[0] || inlon > self->lons[self->lons_count - 1]) {
if (self->lons[0] + 360 - self->lons[self->lons_count - 1] <=
self->lons[1] - self->lons[0]) {
/*it's a global field in longitude*/
self->i[0] = 0;
self->i[1] = self->lons_count - 1;
nearest_lons_found = 1;
}
else
return GRIB_OUT_OF_AREA;
}
}
}
else {
if (inlon > self->lons[0] || inlon < self->lons[self->lons_count - 1]) {
/* try to scale*/
if (inlon > 0)
inlon -= 360;
else
inlon += 360;
if (self->lons[0] - self->lons[self->lons_count - 1] - 360 <=
self->lons[0] - self->lons[1]) {
/*it's a global field in longitude*/
self->i[0] = 0;
self->i[1] = self->lons_count - 1;
nearest_lons_found = 1;
}
else if (inlon > self->lons[0] || inlon < self->lons[self->lons_count - 1])
return GRIB_OUT_OF_AREA;
}
}
grib_binary_search(self->lats, self->lats_count - 1, inlat,
&(self->j[0]), &(self->j[1]));
if (!nearest_lons_found)
grib_binary_search(self->lons, self->lons_count - 1, inlon,
&(self->i[0]), &(self->i[1]));
if (!self->distances)
self->distances = (double*)grib_context_malloc(c, NUM_NEIGHBOURS * sizeof(double));
if (!self->k)
self->k = (size_t*)grib_context_malloc(c, NUM_NEIGHBOURS * sizeof(size_t));
kk = 0;
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
self->k[kk] = self->i[ii] + self->lons_count * self->j[jj];
self->distances[kk] = geographic_distance_spherical(radiusInKm, inlon, inlat,
self->lons[self->i[ii]], self->lats[self->j[jj]]);
kk++;
}
}
}
kk = 0;
/*
* Brute force algorithm:
* First unpack all the values into an array. Then when we need the 4 points
* we just index into this array so no need to call grib_get_double_element_internal
*
* if (nearest->values) grib_context_free(c,nearest->values);
* nearest->values = grib_context_malloc(h->context,nvalues*sizeof(double));
* if (!nearest->values) return GRIB_OUT_OF_MEMORY;
* ret = grib_get_double_array(h, self->values_key, nearest->values ,&nvalues);
* if (ret) return ret;
*/
if (values) {
/* See ECC-1403 and ECC-499 */
/* Performance: Decode the field once and get all 4 values */
if ((ret = grib_get_double_element_set(h, self->values_key, self->k, NUM_NEIGHBOURS, values)) != GRIB_SUCCESS)
return ret;
}
for (jj = 0; jj < 2; jj++) {
for (ii = 0; ii < 2; ii++) {
distances[kk] = self->distances[kk];
outlats[kk] = self->lats[self->j[jj]];
outlons[kk] = self->lons[self->i[ii]];
if (is_rotated) {
/* Unrotate resulting lat/lon */
double new_lat = 0, new_lon = 0;
unrotate(outlats[kk], outlons[kk], angleOfRotation, southPoleLat, southPoleLon, &new_lat, &new_lon);
outlats[kk] = new_lat;
outlons[kk] = new_lon;
}
/* See ECC-1403 and ECC-499
* if (values) {
* grib_get_double_element_internal(h, self->values_key, self->k[kk], &(values[kk]));
*}
*/
/* Using the brute force approach described above */
/* Assert(self->k[kk] < nvalues); */
/* values[kk]=nearest->values[self->k[kk]]; */
if (self->k[kk] >= INT_MAX) {
/* Current interface uses an 'int' for 'indexes' which is 32bits! We should change this to a 64bit type */
grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_regular: Unable to compute index. Value too large");
return GRIB_OUT_OF_RANGE;
} else {
indexes[kk] = (int)self->k[kk];
}
kk++;
}
}
return GRIB_SUCCESS;
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_regular* self = (grib_nearest_regular*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -1,134 +0,0 @@
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/*
This is used by make_class.pl
START_CLASS_DEF
CLASS = nearest
SUPER = grib_nearest_class_gen
IMPLEMENTS = init
IMPLEMENTS = find;destroy
MEMBERS = double* lats
MEMBERS = int lats_count
MEMBERS = double* lons
MEMBERS = int lons_count
MEMBERS = double* distances
MEMBERS = int* k
MEMBERS = int* i
MEMBERS = int* j
MEMBERS = const char* Ni
MEMBERS = const char* Nj
END_CLASS_DEF
*/
/* START_CLASS_IMP */
/*
Don't edit anything between START_CLASS_IMP and END_CLASS_IMP
Instead edit values between START_CLASS_DEF and END_CLASS_DEF
or edit "nearest.class" and rerun ./make_class.pl
*/
static void init_class (grib_nearest_class*);
static int init (grib_nearest* nearest,grib_handle* h,grib_arguments* args);
static int find(grib_nearest* nearest, grib_handle* h,double inlat, double inlon, unsigned long flags, double* outlats,double* outlons, double *values,double *distances, int *indexes,size_t *len);
static int destroy (grib_nearest* nearest);
typedef struct grib_nearest_space_view{
grib_nearest nearest;
/* Members defined in gen */
const char* values_key;
const char* radius;
int cargs;
/* Members defined in space_view */
double* lats;
int lats_count;
double* lons;
int lons_count;
double* distances;
int* k;
int* i;
int* j;
const char* Ni;
const char* Nj;
} grib_nearest_space_view;
extern grib_nearest_class* grib_nearest_class_gen;
static grib_nearest_class _grib_nearest_class_space_view = {
&grib_nearest_class_gen, /* super */
"space_view", /* name */
sizeof(grib_nearest_space_view), /* size of instance */
0, /* inited */
&init_class, /* init_class */
&init, /* constructor */
&destroy, /* destructor */
&find, /* find nearest */
};
grib_nearest_class* grib_nearest_class_space_view = &_grib_nearest_class_space_view;
static void init_class(grib_nearest_class* c)
{
}
/* END_CLASS_IMP */
static int init(grib_nearest* nearest, grib_handle* h, grib_arguments* args)
{
grib_nearest_space_view* self = (grib_nearest_space_view*)nearest;
self->Ni = grib_arguments_get_name(h, args, self->cargs++);
self->Nj = grib_arguments_get_name(h, args, self->cargs++);
self->i = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
self->j = (int*)grib_context_malloc(h->context, 2 * sizeof(int));
return 0;
}
static int find(grib_nearest* nearest, grib_handle* h,
double inlat, double inlon, unsigned long flags,
double* outlats, double* outlons,
double* values, double* distances, int* indexes, size_t* len)
{
grib_nearest_space_view* self = (grib_nearest_space_view*)nearest;
return grib_nearest_find_generic(
nearest, h, inlat, inlon, flags, /* inputs */
self->values_key, /* outputs to set the 'self' object */
&(self->lats),
&(self->lats_count),
&(self->lons),
&(self->lons_count),
&(self->distances),
outlats, outlons, /* outputs of the find function */
values, distances, indexes, len);
}
static int destroy(grib_nearest* nearest)
{
grib_nearest_space_view* self = (grib_nearest_space_view*)nearest;
grib_context* c = grib_context_get_default();
if (self->lats) grib_context_free(c, self->lats);
if (self->lons) grib_context_free(c, self->lons);
if (self->i) grib_context_free(c, self->i);
if (self->j) grib_context_free(c, self->j);
if (self->k) grib_context_free(c, self->k);
if (self->distances) grib_context_free(c, self->distances);
return GRIB_SUCCESS;
}

View File

@ -8,23 +8,28 @@
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#include "grib_api_internal.h"
/* This file is generated by ./make_class.pl */
#include "grib_nearest_class.h"
#include "grib_nearest_factory.h"
#include "accessor/grib_accessor_class_nearest.h"
struct table_entry
{
const char* type;
grib_nearest_class** cclass;
eccodes::geo_nearest::Nearest** nearest;
};
static const struct table_entry table[] = {
/* This file is generated by ./make_class.pl */
#include "grib_nearest_factory.h"
{ "healpix", &grib_nearest_healpix, },
{ "lambert_azimuthal_equal_area", &grib_nearest_lambert_azimuthal_equal_area, },
{ "lambert_conformal", &grib_nearest_lambert_conformal, },
{ "latlon_reduced", &grib_nearest_latlon_reduced, },
{ "mercator", &grib_nearest_mercator, },
{ "polar_stereographic", &grib_nearest_polar_stereographic, },
{ "reduced", &grib_nearest_reduced, },
{ "regular", &grib_nearest_regular, },
{ "space_view", &grib_nearest_space_view, },
};
grib_nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* error)
eccodes::geo_nearest::Nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* error)
{
size_t i = 0, num_table_entries = 0;
*error = GRIB_NOT_IMPLEMENTED;
@ -33,15 +38,16 @@ grib_nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* er
num_table_entries = sizeof(table) / sizeof(table[0]);
for (i = 0; i < num_table_entries; i++) {
if (strcmp(type, table[i].type) == 0) {
grib_nearest_class* c = *(table[i].cclass);
grib_nearest* it = (grib_nearest*)grib_context_malloc_clear(h->context, c->size);
it->cclass = c;
*error = grib_nearest_init(it, h, args);
eccodes::geo_nearest::Nearest* creator = *(table[i].nearest);
eccodes::geo_nearest::Nearest* it = creator->create();
*error = it->init(h, args);
if (*error == GRIB_SUCCESS)
return it;
grib_context_log(h->context, GRIB_LOG_ERROR, "grib_nearest_factory: Error instantiating nearest %s (%s)",
table[i].type, grib_get_error_message(*error));
grib_nearest_delete(it);
gribNearestDelete(it);
return NULL;
}
}

View File

@ -1,11 +1,26 @@
/* This file is automatically generated by ./make_class.pl, do not edit */
{ "gen", &grib_nearest_class_gen, },
{ "healpix", &grib_nearest_class_healpix, },
{ "lambert_azimuthal_equal_area", &grib_nearest_class_lambert_azimuthal_equal_area, },
{ "lambert_conformal", &grib_nearest_class_lambert_conformal, },
{ "latlon_reduced", &grib_nearest_class_latlon_reduced, },
{ "mercator", &grib_nearest_class_mercator, },
{ "polar_stereographic", &grib_nearest_class_polar_stereographic, },
{ "reduced", &grib_nearest_class_reduced, },
{ "regular", &grib_nearest_class_regular, },
{ "space_view", &grib_nearest_class_space_view, },
/*
* (C) Copyright 2005- ECMWF.
*
* This software is licensed under the terms of the Apache Licence Version 2.0
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
*
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
*/
#pragma once
#include "grib_api_internal.h"
#include "geo_nearest/grib_nearest.h"
extern eccodes::geo_nearest::Nearest* grib_nearest_healpix;
extern eccodes::geo_nearest::Nearest* grib_nearest_lambert_azimuthal_equal_area;
extern eccodes::geo_nearest::Nearest* grib_nearest_lambert_conformal;
extern eccodes::geo_nearest::Nearest* grib_nearest_latlon_reduced;
extern eccodes::geo_nearest::Nearest* grib_nearest_mercator;
extern eccodes::geo_nearest::Nearest* grib_nearest_polar_stereographic;
extern eccodes::geo_nearest::Nearest* grib_nearest_reduced;
extern eccodes::geo_nearest::Nearest* grib_nearest_regular;
extern eccodes::geo_nearest::Nearest* grib_nearest_space_view;
eccodes::geo_nearest::Nearest* grib_nearest_factory(grib_handle* h, grib_arguments* args, int* error);

View File

@ -258,6 +258,7 @@ if( HAVE_BUILD_TOOLS )
bufr_ecc-1476
bufr_ecc-1623
bufr_ecc-1785
bufr_ecc-1938
grib_ecc-490
grib_ecc-756
grib_ecc-806

34
tests/bufr_ecc-1938.sh Executable file
View File

@ -0,0 +1,34 @@
#!/bin/sh
# (C) Copyright 2005- ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#
. ./include.ctest.sh
label="bufr_ecc-1938_test"
tempBufr=temp.$label.bufr
tempLog=temp.$label.log
tempOut=temp.$label.txt
# This has 2 unreadable messages
infile=${data_dir}/bufr/bad.bufr
if [ -f "$infile" ]; then
count=$( ${tools_dir}/bufr_count -f $infile )
[ $count -eq 24 ]
set +e
${tools_dir}/bufr_copy $infile $tempBufr
status=$?
set -e
[ $status -ne 0 ]
count=$( ${tools_dir}/bufr_count $tempBufr )
[ $count -eq 24 ]
fi
# Clean up
rm -f $tempBufr $tempLog $tempOut

View File

@ -74,14 +74,13 @@ grib_check_key_equals $tempGribA productDefinitionTemplateNumber 8
grib_check_key_equals $tempGribA typeOfStatisticalProcessing,stepType '2 max'
grib_check_key_equals $tempGribA shortName,name 'max_visp Time-maximum visibility through precipitation'
# Test an expected failure. paramId=140114 contains wave keys
# Test an expected failure, e.g., paramId=239375 has constituentType
set +e
$tools_dir/grib_set -s paramId=140114 $sample_g2 $tempGribA 2>$tempText
$tools_dir/grib_set -s paramId=239375 $sample_g2 $tempGribA 2>$tempText
status=$?
set -e
[ $status -ne 0 ]
grep -q "typeOfWavePeriodInterval .* failed: Key/value not found" $tempText
grep -q "scaleFactorOfLowerWavePeriodLimit .* failed: Key/value not found" $tempText
grep -q "constituentType .* failed: Key/value not found" $tempText
# Clean up

View File

@ -53,6 +53,18 @@ for paramIdFile in $paramIdFiles; do
fi
done
# -----------------------------------
echo "Check for bad shortNames"
# -----------------------------------
shortNameFile="$ECCODES_DEFINITION_PATH/grib2/shortName.def"
grep "^'.*=" $shortNameFile | sed -e 's/ = {//' > $tempText
set +e
grep ' ' $tempText # This grep should fail. No spaces must be found
status=$?
set -e
[ $status -ne 0 ]
# First check the GRIB2 paramId.def and shortName.def
# ----------------------------------------------------
$EXEC ${test_dir}/grib_check_param_concepts paramId $ECCODES_DEFINITION_PATH/grib2/paramId.def

View File

@ -17,12 +17,11 @@
int main(int argc, char* argv[])
{
FILE* f = NULL;
grib_handle* h = NULL;
int err = 0;
int err = 0;
Assert(argc == 2);
f = fopen(argv[1], "rb");
FILE* f = fopen(argv[1], "rb");
Assert(f);
while ((h = grib_handle_new_from_file(0, f, &err)) != NULL) {
@ -39,6 +38,8 @@ int main(int argc, char* argv[])
int type = 0;
GRIB_CHECK(grib_get_native_type(h, name, &type), 0);
Assert( type > 0 && type < 7 );
int ktype = grib_keys_iterator_get_native_type(kiter);
Assert(type == ktype);
const char* type_name = grib_get_type_name(type);
Assert( !STR_EQUAL(type_name, "unknown") );
printf("%s = %s (%d)\n", name, type_name, type);
@ -48,6 +49,16 @@ int main(int argc, char* argv[])
size_t vlen = MAX_VAL_LEN;
GRIB_CHECK(grib_get_string(h, name, value, &vlen), name);
Assert( strlen(value) > 0 );
int e = grib_keys_iterator_get_string(kiter, value, &vlen);
Assert(!e);
Assert( STR_EQUAL(name, value) );
}
if (STR_EQUAL(name, "editionNumber")) {
long lVal = 0;
size_t llen = 1;
int e = grib_keys_iterator_get_long(kiter, &lVal, &llen);
Assert(!e);
Assert(lVal == 1 || lVal == 2);
}
}