eccodes/tigge/kma.pl

107 lines
2.2 KiB
Perl
Executable File

#!/usr/bin/perl -I/marsdev/data/p4/linux/amd64/grib_api/main/perl/GRIB-API/blib/lib -I/marsdev/data/p4/linux/amd64/grib_api/main/perl/GRIB-API/blib/arch
use lib qw(/path/to/install/grib/api/lib);
use GRIB::API;
use strict;
my %DEFAULTS = (
gribMasterTablesVersionNumber => 5,
subdivisionsOfBasicAngle => undef,
);
my @RULES = (
# Dew point ?
[
# condition
{ discipline=>0, parameterCategory=>0, parameterNumber=>7, typeOfFirstFixedSurface => 103 },
# action
{ tigge_short_name => "2d" }, ],
# Mean sea level
[
# condition
{ discipline=>0, parameterCategory=>3, parameterNumber=>1,
typeOfFirstFixedSurface => 101 },
# action
{ tigge_short_name => "msl", }, ],
# Total precip.
[
# condition
{ discipline=>0, parameterCategory=>1, parameterNumber=>8, },
# action
{ productDefinitionTemplateNumber => 11, tigge_short_name => "tp", marsStartStep=>0}, ],
# Single levels
[
# condition
{ typeOfSecondFixedSurface => 255 } ,
# action
{ scaleFactorOfSecondFixedSurface => undef,
scaledValueOfSecondFixedSurface => undef } ],
[
# condition
{ typeOfSecondFixedSurface => 8 } ,
# action
{ scaleFactorOfSecondFixedSurface => undef,
scaledValueOfSecondFixedSurface => undef } ],
[
# condition
{ typeOfFirstFixedSurface => 1 } ,
# action
{ scaleFactorOfFirstFixedSurface => undef,
scaledValueOfFirstFixedSurface => undef } ],
[
# condition
{ typeOfFirstFixedSurface => 101 } ,
# action
{ scaleFactorOfFirstFixedSurface => undef,
scaledValueOfFirstFixedSurface => undef } ],
);
@ARGV = qw(ncep s) unless(@ARGV);
$ARGV[1] = "s" unless($ARGV[1]);
open(IN,"<$ARGV[0]") or die "$ARGV[0]: $!";
open(OUT,">$ARGV[1]") or die "$ARGV[1]: $!";
while(my $g = GRIB::API->new(\*IN))
{
# Initialise using default
$g->set_values(\%DEFAULTS);
# Apply rules
foreach my $r ( @RULES )
{
$g->set_values($r->[1]) if(match($g,$r->[0]));
}
$g->Write(\*OUT) or die "$ARGV[1]: $!";
}
close(OUT) or die "$ARGV[1]: $!";
system("./tigge_check -b bad $ARGV[1] && mv $ARGV[0] done/");
# Checks if a handle matches a rule condition
sub match {
my ($h,$cond) = @_;
foreach my $c ( keys %{$cond} )
{
return 0 unless($h->get_long($c) eq $cond->{$c});
}
return 1;
}