#!/usr/bin/perl ################################################################################ # # # Program name: convert_netcdf.pl # # Version: 1.1 # # Language (Perl, C-shell, etc.): perl # # # # Authors: Don Britton (TFX) # # Contributers: Virgil Middendorf, David Tomalak # # # # Date of last revision: 07/17/08 # # # # Script description: This script optimizes the netcdf file created by GFE. # # ifpnetCDF stores most of the data as floating point # # values. This script creates an optimized netcdf file # # where most of the data is stored as shorts and bytes. # # This makes the netcdf file much smaller and improves # # performance on the web farms. # # # # Directory program runs from: /awips/adapt/ifps/localbin # # # # Revision History: # # 12/19/07: Done created Script. vtm # # 07/17/08: Removed VentRate and MixHgt from the short list because they are # # too large to store in a short variable, thus a digit is being # # truncated at the web farm. vtm # # 07/17/08: Added my standard comment block. vtm # ################################################################################ ######################## # paths to ncdump and ncgen applications ######################## $ncdump = "/usr/local/netcdf/bin/ncdump"; $ncgen = "/usr/local/netcdf/bin/ncgen"; ######################## # list of fields to shorts (integers) and bytes (0-255) ######################## @shorts = qw (MaxT MinT T Td WindChill HeatIndex SnowLevel Wind_Dir Wind20ft_Dir ClearIndex FreeWind_Dir TransWind_Dir Topo Swell_Dir DiffFromOfficialMaxT DiffFromOfficialMinT ClimoPoPDiff DiffFromOfficialWind RHtrend); @bytes = qw (MaxRH MinRH RH Pop Wind_Mag Wind20ft_Mag Sky Wind_Gust FreeWind_Mag LAL Haines TransWind_Mag WindWaveHeight WaveHeight SurfHeight Swell_Mag IceCoverage StormTotalSnow HoursOfSun DSI Period2 Wetflag); ######################## # grab site id from command line ######################## if (@ARGV) { $ifile = $ARGV[0]; $ofile = $ARGV[1]; } else { die "requires a 3-letter site id argument\n"; } ######################## # create filenames ######################## # input $cdlin_filename = $ifile . ".cdl"; $cdlout_filename = $ofile . ".opt.cdl"; # output $cdfin_filename = $ifile; $cdfout_filename = $ofile; # provide some output for log file print "ncdump..."; system "date"; ######################## # ncdump netcdf file to a plain text cdl file for parsing ######################## system "$ncdump $cdfin_filename > $cdlin_filename"; # check return code of system call for success if ($? != 0) { die "ERROR: cdl file unable to be created!\n"; } ######################## # provide some output for log file print "parsing cdl file..."; system "date"; ######################## # if the cdl was successfully created, # open it and begin parsing ######################## if (open IFILE, $cdlin_filename) { ######################## # write out optimized cdl file ######################## open OFILE, ">$cdlout_filename" or die "cannot open $cdlout_filename for output!\n"; while () { ######################## # iterate thru first 2000 lines, # looking only for netcdf header information ######################## if ($counter < 2000) { $counter++; ######################## # iterate thru the list of fields # to be converted to shorts ######################## for $var (@shorts) { # float field_name if (/float $var/) { # replace "float" with "short" s/float/short/; } } ######################## # iterate thru the list of fields # to be converted to bytes ######################## for $var (@bytes) { # float field_name if (/float $var/) { # replace "float" with "byte" s/float/byte/; } } } print OFILE $_; } # close both files close IFILE; close OFILE; # provide some output for a log file printf "ncgen file...: %s\n", $cdfout_filename; system "date"; ######################## # ncgen cdl file to create the optimized netcdf file ######################## system "$ncgen -o $cdfout_filename $cdlout_filename"; # check return code of system call for success if ($? != 0) { die "ERROR: optimized netcdf file unable to be created!\n"; } ######################## } # provide some output for log file system "date";